2016-09-13 6 views
-1

私のフラグメントに4つのAsyncTaskクラスがあります。私は4つすべてを実行したいが、一度に1つは実行する。私はtask.execute().get()とtask.execute()。getStatus()のようなものを試しました。これらはうまくいくようには思えません。タスクが実行中に別のタスクを実行できないというエラーが表示されます。これらは私が実行しようとしています4 AsyncTasksです:各AsyncTaskが次のAsyncTaskを実行する前に終了するのを待ちます。

ProgressDialog dialog = new ProgressDialog(getActivity()); 
    dialog.setTitle("Finalizing Your Run"); 
    dialog.setMessage("We hope you had fun running! Please wait while we send your running data to our system. This may take a few seconds depending on your internet connection"); 
    dialog.setCancelable(false); 
    dialog.show(); 
    //All the async tasks to be executed 
    AddRouteCheckpoints checkpointTask = new AddRouteCheckpoints(getActivity(), dialog); 
    GetRouteIdTask routeIdTask = new GetRouteIdTask(getActivity(), dialog); 
    AddRouteTask addRouteTask = new AddRouteTask(getActivity(), dialog); 
    AddRunTask personalRunTask = new AddRunTask(getActivity(), dialog); 

各AsyncTaskは、次のAsyncTaskに移動する前に、完全にそのタスクを完了確保する方法はありますか?

+0

それぞれにコールバックインターフェイスを提供し、その中から次のコールバックインターフェイスを呼び出すことができます – Shaishav

+1

あなたの '実行 'はどこですか?そして、それに加えて、結果が利用可能になるまで 'get'を待ちます。あなたの実装にはおそらく欠陥があります。 –

+0

"次のAsyncTaskに移行する前に、各AsyncTaskがそのタスクを完全に完了することを保証する方法はありますか?" 1つのタスク内で4つのタスクに分散しているすべてを行う方が良い場合、私に鳴りますか? – Fildor

答えて

0
progressupdate上の各非同期タスクの
  1. チェック進捗それはonpostあなたも1の成功executoinにsendbroadcastことができ、次のいずれか
  2. に電話を与えるには、その後、100%である場合。
  3. それぞれにインターフェイスを作成し、それらを呼び出して次のインターフェイスを呼び出すこともできます。
0

先日も同じ状況がありました。私はこのようにして解決しました:あなたの活動の参照を非同期クラスのコンストラクタに渡し、バックグラウンドでdo関数を実行します。

if (asynclass.getStatus() == android.os.AsyncTask.Status.PENDING) { 
     asynclass.execute(); 
    } else if (RF.getStatus() == android.os.AsyncTask.Status.FINISHED) { 
     asynclass = new asyncclass(); 
     asynclass.execute(); 
    } else { 
     Toast.maketoast(this, "Plz wait", 1).show(); 
    } 

か、でそれを行うことができます

以下のようにあなたがそれを行うことができます。今のポストにタスクを再実行するために非同期クラスからウル活動のパブリックメソッドを呼び出す...か、これを試して機能を実行myAsyncTask.executeOnExecutor(SERIAL_EXECUTOR)

AsyncTask a = new AsyncTask(); 
AsyncTask b = new AsyncTask(); 
AsyncTask c = new AsyncTask(); 

a.executeOnExecutor (SERIAL_EXECUTOR); 
b.executeOnExecutor (SERIAL_EXECUTOR); 
c.executeOnExecutor (SERIAL_EXECUTOR); 

乾杯

2

SingleThreadExecutorでこれらのAsyncTasksを実行しないのはなぜ?その後、

Executor executor = Executors.newSingleThreadExecutor(); 

そして、あなたのエグゼであなたのタスクを実行します。

task.executeOnExecutor(executor); 

一つだけのスレッドがあなたのAsyncTasksを実行するために使用され、他のものがキューイングされますこの方法です。

関連する問題