参考:AsyncTask
参考:AsyncTaskを使った非同期処理のきほん
AsyncTask<Params, Progress, Result>
と書いてある。doInBackgroundメソッドの引数の型, onProgressUpdateメソッドの引数の型, onPostExecuteメソッドの戻り値の型らしい。
AsyncTaskクラスを継承したクラスを作って、非同期処理を書く。
Activityで、上記タスクのインスタンスを作って、executeで非同期処理を実行させる。
execute時に、doInBackgroundの引数を渡せる。doInBackgroundの引数は何個でも渡せるようにする必要があるっぽい。
MyTask.java
public class MyTask extends AsyncTask<Integer, Integer, String> {
private TextView txt;
public MyTask(TextView txt) {
super();
this.txt = txt;
}
@Override
protected String doInBackground(Integer...x) {
try {
Log.d("TEST", "Start Sleep");
Thread.sleep(5000);
} catch(Exception e) {
Log.d("TEST", e.getMessage());
}
return "終わりました";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
txt.setText(result);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MyTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
task = new MyTask((TextView)findViewById(R.id.result));
task.execute();
TextView hello = (TextView)findViewById(R.id.hello);
hello.setText("World");
}
}
非同期処理中のプログレスバー表示
AsyncTaskは、4ステップある。あと、1回しか使えない。なので一回だけ非同期処理したいときに使うやつらしい。
- onPreExecute 実行前
- doInBackground 実行開始
- onProgressUpdate 実行中
- onPostExecute 実行後
onPreExecuteでプログレスバーを初期設定・表示させて、doInBackgroundで進捗状況を計算して、onProgressUpdateを都度実行させて、onProgressUpdateでプログレスバーを更新して、onPostExecuteでプログレスバー消す。
MyTask.java
public class MyTask extends AsyncTask<Integer, Integer, String> {
private TextView txt;
private ProgressDialog progress;
private Activity ac;
private final Integer wait = 5000;
public MyTask(Activity a, TextView t) {
super();
ac = a;
txt = t;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progress = new ProgressDialog(ac);
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progress.setIndeterminate(false);
progress.setMax(wait);
progress.setProgress(0);
progress.show();
}
@Override
protected String doInBackground(Integer...x) {
try {
for(int i = 0; i < wait; i += 200){
Thread.sleep(200);
publishProgress(i);
}
} catch(Exception e) {
Log.d("TEST", e.getMessage());
}
return "終わりました";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progress.setProgress(values[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progress.dismiss();
txt.setText(result);
}
}