Androidで"ロード中"のダイアログを出しながら非同期でサーバー通信するテスト
タイトルの通り。
任意のURLを入力して、ボタン押下でサーバー通信を行い、結果を表示するテスト。
res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/connect" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
src/com.example.progressdialogtest/MainActivity.java
package com.example.progressdialogtest; import java.io.IOException; import java.util.ArrayList; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ボタン押下時の処理を定義 ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 画面上ではロード中のダイアログを表示 progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setCancelable(true); progressDialog.setMessage("ロード中"); progressDialog.show(); // バックグラウンドでサーバー通信をおこなう new AsyncTask<Void, Void, String>() { // サーバー通信実行処理 @Override protected String doInBackground(Void... p) { // EditView に入力したURLを取得 String url = ((EditText)findViewById(R.id.editText1)).getText().toString(); HttpClient httpClient = new DefaultHttpClient(); HttpPost post = new HttpPost(url); // パラメータのセット(今回は固定で意味はない) ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("name", "value")); // 通信実行とレスポンスの文字列返却 String result = ""; try { post.setEntity(new UrlEncodedFormEntity(params, "utf-8")); HttpResponse response = httpClient.execute(post); result = EntityUtils.toString(response.getEntity()); } catch (IOException e) { e.printStackTrace(); } return result; } // サーバー通信終了処理 @Override protected void onPostExecute(String result) { // doInBackground からレスポンスの文字列を受け取って TextView にセット ((TextView)findViewById(R.id.textView1)).setText(result); // 処理が終わったのでロード中のダイアログを終了させる progressDialog.dismiss(); } }.execute(); } }); } }