読者です 読者をやめる 読者になる 読者になる

nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

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();
        	}
        });
    }
}