AsyncTask


AsyncTaskクラスは抽象クラスであり、Androidに必要なメインスレッドとワークスレッドの分離構造を実現するのに役立ちます.

AsyncTask主要再定義関数


AndroidのAsyncTaskライフサイクル管理は、5つのライフサイクル関数を再定義することで管理できます.

因子は第3のクラスとして定義され、 Params, Progressと Result .

ステップを4つのステップとして定義

  • onPreExecute:UI Threadで実行され、Progress Barを解放すると
  • になります.
  • doInBackground Background thread on PreExecute()を呼び出し、
  • を呼び出します.
  • onProgressUpdate UI Threadで実行し、publishProgress(Progress...)を呼び出すと実行します.主にProgress Bar更新に使用されます.
  • は、PostExecute UI Thread上で実行されます.すべてのバックグラウンドタスクは、終了後に呼び出されます.
  • private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
        protected Long doInBackground(URL... urls) {
            int count = urls.length;
            long totalSize = 0;
            for (int i = 0; i < count; i++) {
                totalSize += Downloader.downloadFile(urls[i]);
                publishProgress((int) ((i / (float) count) * 100));
                // Escape early if cancel() is called
                if (isCancelled()) break;
            }
            return totalSize;
        }
    
        protected void onProgressUpdate(Integer... progress) {
            setProgressPercent(progress[0]);
        }
    
        protected void onPostExecute(Long result) {
            showDialog("Downloaded " + result + " bytes");
        }
    }
    
    // -------------------------------------------------------------------------------
    
    new DownloadFilesTask().execute(url1, url2, url3);

    可変パラメータ(varargs)


    可変因子は0以上の因子を許容できることを示す.
    thisIsFunction(); // 가능
    thisIsFunction("arg1"); //가능
    thisIsFunction("arg1", "arg2", "arg3"); //가능
    thisIsFunction(new String[]{"arg1", "arg2", "arg3"}); //가능
    
    /*
    	인자를 omit 하여도 성립하고, 1개 이상의 인자를 넘겨주거나,
    	배열 형태로 넘겨 줄 수 있다. 하지만, 여기서 주의해야 할 점은,
    	인자를 1개만 넘겨주어도 배열의 형태로 다뤄줘야 한다는 점
    */
    
    // doInBackground 함수로 돌아가서, urls를 1개만 넘겨주었더라도,
    protected Long doInBackground(URL... urls) {
        long totalSize =  Downloader.downloadFile(urls[0]);
        return totalSize;
    }
    /*배열로 처리해주어야만 한다.
    	또한, varargs를 다른 parameter와 동시에 넘겨줄 경우
    	varargs는 항상 나중에 자리해야만 한다.
    */
    
    // -------------------------------------------------------------------------------
    
    thisIsFunction(int n, String... strings) // 가능
    thisIsFunction(String... strings, int n) // Error

    AsyncTaskのキャンセル

    ///AsyncTask는 cancel(boolean)을 통해 취소할 수 있다.
    
    downloadTask.cancel(true);
    AsyncTaskがキャンセルされた場合、onPostExecute(オブジェクト)は呼び出されず、doInBackground(オブジェクト[])が戻った時点でonCanceled(オブジェクト)が呼び出されます.
    TaskがキャンセルされたときにTaskがキャンセルをできるだけ早く処理するようにするには、次の手順に従います. ISCanceled()をdoInBackground関数で定期的にチェックする必要があります.

    その他の注意事項


    Android Developerの正式なドキュメントには、次のものが含まれています.
    onPreExecute()
    onPostExecute(Result)
    doInBackground(Params...)
    onProgressUpdate(Progress...)
    動作を表す 明示的に呼ぶな.
    さらに、AsyncTaskの作成、ロード、および実行()関数呼び出しは、UI Thread上で実行する必要があります.
    taskの実行は、1回だけ呼び出す必要があることを示す.