サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > [Android]AsyncTaskで別スレッドで処理をするサンプル#tryAsyncTask00
Google Play AAKAKAxSOFTへ

[Android]AsyncTaskで別スレッドで処理をするサンプル#tryAsyncTask00

実行ファイル(APK)やサンプル(zip)をダウンロードする
tryAsyncTask00の実行イメージ

重い処理を別スレッドで処理するようにして、ListViewを常に更新し続ける様にしたい。
何かを読み込んでリストビューに表示ということをするとデータのサイズが大きい場合リストビューが表示されるまでに時間がかかる。
なので、リストビューを表示している間にデータを用意する様な事をしたい。

検索した事
 Android スレッド
 AsyncTask Android

開発環境
 Eclipse IDE バージョン: 3.7 Indigo Service Release 2
 ターゲットプラットフォーム: 2.1
 API レベル: 7

package sample.example.tryasynctask00;

import java.util.Comparator;
import java.util.Random;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.support.v4.app.NavUtils;

/**
 * アクティビティ
 *
 */
public class TryAsyncTask00Activity extends Activity {

	private ArrayAdapter<String>	mAdapter;	// リストビューのアダプタ
	private LoadAsyncTask mTask;	// 処理用スレッド
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_try_async_task00);
        
        // 一番シンプルなアダプタを作ってリストビューに登録する
        this.mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        ListView lv = (ListView)this.findViewById(R.id.listView1);
        lv.setAdapter(this.mAdapter);

        // タスクを作る
        this.mTask = new LoadAsyncTask(this.mAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_try_async_task00, menu);
        return true;
    }

    /**
     * スタートボタンが押された
     * @param view
     */
    public void onClickStart(View view) {
    	
    	// タスクを実行
    	this.mTask.execute("");
    }
    
    /**
     * ストップボタンが押された
     * @param view
     */
    public void onClickStop(View view) {
    	this.mTask.cancel(true);
    }
    
    
}


/**
 * タスク処理
 *
 */
class LoadAsyncTask extends AsyncTask<String, String, Long> {

	private ArrayAdapter<String> mAdapter;	// リストビューに値を書き込むためのアダプタ
	
	/**
	 * コンストラクタ
	 * @param adapter
	 */
	public LoadAsyncTask(ArrayAdapter<String> adapter) {
		this.mAdapter = adapter;
	}

	/**
	 * doInBackgroundが始まる前に呼び出される
	 */
	@Override
	protected void onPreExecute() {
		Log.d("LoadAsyncTask#onPreExecute", "doInBackgroundが始まった");
		super.onPreExecute();
	}

	/**
	 * doInBackgroundが終わったら呼び出される
	 */
	@Override
	protected void onPostExecute(Long result) {
		Log.d("LoadAsyncTask#onPostExecute", "doInBackgroundが終わった");
		super.onPostExecute(result);
	}

	
	/**
	 * 途中経過をここで通知
	 * publishProgress呼ばれるとここに飛ぶ
	 * AsyncTask<String, String, Long>
	 *                 ↑ここが引数の型
	 */
	@Override
	protected void onProgressUpdate(String... values) {
		
		// リストビューからアダプターを取り出す
		ArrayAdapter<String> adapter = this.mAdapter;
		
		// リストビューに追加する
		for (int i = 0; i < values.length; i++) {
			adapter.add(values[i]);
		}
		// 昇順にソートする
		adapter.sort(new Comparator<String>() {

			public int compare(String lhs, String rhs) {
				return lhs.compareTo(rhs);
			}
		});
		
		
		super.onProgressUpdate(values);
	}

	/**
	 * ここで重たい処理をする
	 *                        ↓ここが戻り値
	 * AsyncTask<String, String, Long>の
	 *           ↑ここの型が引数になる
	 */
	@Override
	protected Long doInBackground(String... params) {
		
		Random random = new Random();
		String[] tmp = new String[10];
		
		// 適当に待たせながら処理をする
		for (int j = 0; j < 1000; j++) {
			
			// キャンセルされた場合の処理
			if (this.isCancelled() == true) {
				Log.d("LoadAsyncTask#doInBackground", "cancelが呼び出された");
				break;
			}
			
			// 適当にランダムな値を作る
			for (int i = 0; i < 10; i++) {
				tmp[i] = String.format("ランダムな値:%06d", random.nextInt(100000));
			}
			// 処理の経過を通知
			this.publishProgress(tmp);
			
			// ちょっと待つ
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 処理がキャンセルされたときに呼び出される
	 */
	@Override
	protected void onCancelled() {
		Log.d("LoadAsyncTask#doInBackground", "キャンセルされました。");
		super.onCancelled();
	}

}
サンプルプロジェクトをダウンロード APKファイルをダウンロード

, , , ,

[C#|CSharp]小さなコード [Android]電話帳にアクセスして表示するサンプル#tryPhoneBook00

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>