このセクションでは、android-asynctaskの概要と、なぜ開発者がそれを使いたいのかを概説します。
また、android-asynctask内の大きなテーマについても言及し、関連するトピックにリンクする必要があります。 android-asynctaskのドキュメンテーションは新しいので、これらの関連トピックの初期バージョンを作成する必要があります。
概念
AsyncTaskはバックグラウンドで操作を実行できるクラスで、結果はUIスレッドに公開されます。主な目的は、スレッドを操作するために必要なハンドラとすべてのものを排除することによってスレッドを開始/実行するための定型コードをすべて削除することです。また、AsyncTaskの目的は、長時間の操作ではなく、バックグラウンドスレッド(多くても数秒)で短時間の操作を行うことです。したがって、AsyncTaskを汎用スレッドフレームワークと混同しないことが重要です。時間のかかる操作を行う必要がある場合は、並行パッケージが推奨されます。
一般的な考慮事項
AsyncTaskは、Params、Progress、およびResultsという3つの汎用タイプで定義されています。それが実行された瞬間から、それは4つのステップ(方法)を経る。 1つはonPreExecuteで、誰かが読み込みダイアログや、実行を開始しようとしていることをユーザーに通知できるUIメッセージを定義できます。次に、 doInBackgroundは、Uiスレッドとは別のスレッドで非同期に実行されるメソッドです。 3番目の方法はonProgressUpdateで、ユーザーにステータスを通知できるUIスレッドでも実行できます。最後のメソッドはonPostExecuteで、主に結果を公開するために使用されます。
以下は、AsyncTaskを使用して文字列を返す方法の例です。
例1
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (FloatingActionButton) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
executeAsyncTaskOperation();
}
});
}
private void executeAsyncTaskOperation() {
new CustomAsyncTask(this).execute();
}
private static class CustomAsyncTask extends AsyncTask<Void, Void, String> {
private Context context;
private ProgressDialog progressDialog;
public CustomAsyncTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
}
@Override
protected String doInBackground(Void... params) {
String object = null;
try {
Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
Thread.sleep(500);
//bject = "new object";
} catch (Exception exc) {
Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
object = null;
}
return object;
}
@Override
protected void onPostExecute(String s) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
if (s != null) {
Toast.makeText(context, "finished successfully!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();
}
}
}
}
例2
ここで、AsyncTaskは少し異なり、executeメソッドはバックグラウンドで解析されるデータのリストを受け取ります。返品結果はこのチェックによって異なります。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
executeAsyncTaskOperation();
}
});
}
private void executeAsyncTaskOperation() {
Boolean[] bools = new Boolean[10];
for (int k = 0; k < 10; k++) {
if (k % 2 == 0) {
bools[k] = true;
} else {
bools[k] = false;
}
}
new CustomAsyncTask(this).execute(bools);
}
private static class CustomAsyncTask extends AsyncTask<Boolean, Void, Integer> {
private Context context;
private ProgressDialog progressDialog;
public CustomAsyncTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "Please wait...", "Loading data from web");
}
@Override
protected Integer doInBackground(Boolean... params) {
int count = 0;
try {
Thread.sleep(1000);
Log.d(CustomAsyncTask.class.getCanonicalName(), "doInBackground");
for (Boolean param : params) {
if (param) {
count++;
}
}
} catch (Exception exc) {
Log.e(CustomAsyncTask.class.getCanonicalName(), "exception");
count = 0;
}
return count;
}
@Override
protected void onPostExecute(Integer s) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
if (s != null && s > 0) {
Toast.makeText(context, "finished loading: " + s + " tasks", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "finished unsuccessfully!", Toast.LENGTH_LONG).show();
}
}
}
}