web-dev-qa-db-ja.com

Android AsyncTaskの例と説明

アプリでAsyncTaskを使用したいのですが、動作の簡単な説明を含むコードスニペットを見つけることができません。 documentation または多くのQ&Aを繰り返すことなく、すぐにスピードを取り戻すのに役立つものが欲しいだけです。

38
Suragch

AsyncTaskは、Androidでスレッドなどのより複雑なメソッドを処理することなく、並列処理を実装する最も簡単な方法の1つです。UIスレッドとの基本レベルの並列処理を提供しますが、長い操作(たとえば、2秒以内)には使用しないでください。

AsyncTaskには4つのメソッドがあります

  • onPreExecute()
  • doInBackground()
  • onProgressUpdate()
  • onPostExecute()

ここで、doInBackground()は、バックグラウンド計算が実行される場所であるため、最も重要です。

コード:

以下に、説明を含む骨格コードの概要を示します。

public class AsyncTaskTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  

        // This starts the AsyncTask
        // Doesn't need to be in onCreate()
        new MyTask().execute("my string parameter");
    }

    // Here is the AsyncTask class:
    //
    // AsyncTask<Params, Progress, Result>.
    //    Params – the type (Object/primitive) you pass to the AsyncTask from .execute() 
    //    Progress – the type that gets passed to onProgressUpdate()
    //    Result – the type returns from doInBackground()
    // Any of them can be String, Integer, Void, etc. 

    private class MyTask extends AsyncTask<String, Integer, String> {

        // Runs in UI before background thread is called
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            // Do something like display a progress bar
        }

        // This is run in a background thread
        @Override
        protected String doInBackground(String... params) {
            // get the string from params, which is an array
            String myString = params[0];

            // Do something that takes a long time, for example:
            for (int i = 0; i <= 100; i++) {

                // Do things

                // Call this to update your progress
                publishProgress(i);
            }

            return "this string is passed to onPostExecute";
        }

        // This is called from background thread but runs in UI
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            // Do things like update the progress bar
        }

        // This runs in UI when background thread finishes
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            // Do things like hide the progress bar or change a TextView
        }
    }
}

流れ図:

以下は、すべてのパラメーターとタイプの行き先を説明する図です。

AsyncTask flow

その他の役立つリンク:

189
Suragch