を使用し、AsyncTask
必要に応じてこれらを実装してください。ユーザーが何かをしている間にバックグラウンドで何かをするという考えに言及しているので、UIを変更したいと思うでしょう。
Android の詳細については、これらのリンクをご覧ください。彼らはカバーしRunnable
、AsyncTask
Handler
通常、ここに完全な例を貼り付けることはしませんが、満足のいく例を見つけるのに長い間苦労しました。あなたや他の人を助けるために、ここに私の好みの方法があります. 私は通常、タスクを開始したAsyncTask
へのコールバックで を使用します。Activity
この例では、ユーザーがonClick(...)
ボタンなどでトリガーしたふりをしていますが、Activity
.
// Within your Activity, call a custom AsyncTask such as MyTask
public class MyActivity extends Activity implements View.OnClickListener, MyTask.OnTaskComplete {
//...
public void onClick(View v) {
// For example, thet user clicked a button
// get data via your task
// using `this` will tell the MyTask object to use this Activty
// for the listener
MyTask task = new MyTask(this);
task.execute(); // data returned in callback below
}
public void onTaskComplete(MyObject obj) {
// After the AsyncTask completes, it calls this callback.
// use your data here
mTextBox.setText(obj.getName);
}
}
タスクからデータを取得するにはさまざまな方法がありますが、私OnTaskComplete
は上で実装され、下でトリガーされるようなインターフェイスを好みます。
ここでの主なアイデアは、内部クラスがより複雑になるにつれて、それらを避けたいということです。ほとんど個人的な好みですが、再利用可能なタスクを 1 つのクラスの外に分けることができます。
public class MyTask extends AsyncTask<Void, Void, MyObject> {
public static interface OnTaskComplete {
public abstract void onTaskComplete(MyObject obj);
}
static final String TAG = "MyTask";
private OnTaskComplete mListener;
public MyTask(OnTaskComplete listener) {
Log.d(TAG, "new MyTask");
if (listener == null)
throw new NullPointerException("Listener may not be null");
this.mListener = listener;
}
@Override
protected MyObject doInBackground(Void... unused) {
Log.d(TAG, "doInBackground");
// do background tasks
MyObbject obj = new MyObject();
// Do long running tasks here to not block the UI
obj.populateData();
return
}
@Override
protected void onPostExecute(MyObject obj) {
Log.d(TAG, "onPostExecute");
this.mListener.onTaskComplete(obj);
}
}