1

長い間検索した後、次のリンクをたどって理解しました、

http://developer.android.com/reference/android/os/AsyncTask.html#cancel(ブール値)

AsyncTask は onPostExecute を実行しません

しかし、私はサーバーにいくつかの API ヒットを実行したいと考えており、すべてのデータを取得した後、スプラッシュスクリーンからメインアクティビティに移動したいと考えています。以下は私のコードです。. . .

class Startsyntask extends AsyncTask<Void, Void, Void> 
    {

         @Override
         protected Void doInBackground(Void... arg0) 
         { 
            raw_data = new File(Environment.getExternalStorageDirectory() + "/.MyFoldernew");
            if(raw_data.exists())
            {
                Log.e("directory exists", " already ");
                new read_syntask().execute();
            }
            else
            {
                Log.e("directory created", " newly ");
                raw_data.mkdirs();
                new write_syntask().execute();
            }
            return null;    
         }

         @Override
         protected void onPostExecute(Void unused) 
         {
             if( i == 6)
             {
                finish();
                startActivity(new Intent("com.sample.app.Tabbar"));
             }
         }
    }

コード内のread_synctaskwrite_synctaskは、いくつかの特定の操作を行う別の非同期タスクです。これらの非同期タスクでは、 doinBackground の後に onPostexecute を呼び出しています。

実際には Tabbar Activity に移動し、API ヒットが続き、Tabbar activity でサーバーからデータを読み取っています。doinBackground で非同期タスクを完了した後にのみ、onProgress を呼び出す必要があります。

4

2 に答える 2

1

実際、

new read_syntask().execute();

new write_syntask().execute();

どちらも、タスクの完了を待たずに次の実行ステップを実行する非同期呼び出しonPostExecute()を持っているため、両方が終了する前に実行が行われますAsyncTask

あなたがしなければならないことは、

使用 new read_syntask().execute().get();してnew write_syntask().execute().get();

get()メソッド fromはAsyncTaskAsyncTaskの完了を待ってからonPostExecute()実行します。(しかし、UI スレッドをブロックすると思います)。

更新:(最良のアプローチ)

実際には AsyncTask は必要ありません。Activity のメソッドのif-else 条件と、起動するためのコードをStartsyntask 直接記述できます。raw_dataTabbar

finish();
startActivity(new Intent("com.sample.app.Tabbar"));

read_syntaskまたはwrite_syntaskのいずれかにある必要がありますonPostExecute()

于 2013-02-14T07:00:32.343 に答える
0

「 doinBackground で非同期タスクを完了した後にのみ、 onProgress を呼び出す必要があることをどのように実装できますか」という引用。

よくわかりません。しかし、ハンドラーを使用すると役立つ場合があります。非同期タスクの onPostExecute の後にメッセージを送信し、ハンドラーの handleMessage で、やりたいことを行います。

http://developer.android.com/reference/android/os/Handler.html

于 2013-02-14T07:18:13.577 に答える