参考: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); } }