
[Android]AsyncTaskで別スレッドで処理をするサンプル#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(); } }
[C#|CSharp]小さなコード [Android]電話帳にアクセスして表示するサンプル#tryPhoneBook00