2016-12-30 2 views
0

注:私が取り組んでいるアプリは個人用です。私は私の修士論文のデータを収集しようとしています。AsyncTasks間のAndroidスリープ(128以上)

128以上のAsyncTaskを一度に起動しようとしていますが、これはThreadPoolExecutorのために失敗します。私はそれが正常に動作していない理由をいくつか見てきましたが、正しく実装する方法の答えはありません。

私は自分のものをアップロードするのに多くの時間がありましたので、次のアップロードを開始する前に私のMainActivityをスリープ状態にすることを検討していましたが、これもうまくいきません。

for (IrisResult s : results) { 
     try { 
       Thread.sleep(1000); 
       mAzureTableManager.addIrisResult(s); 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
     } 
} 

方法addirisResult()は実際に私がいない最善のアプローチのために、最も簡単な解決策を探していますprotected Void doInBackground(Void... params) {

でAsyncTaskを開始します!

+0

@GabeSechan "AsyncTasksつのスレッド上のすべての実行は、" 真実ではありません。 [実行順序](https://developer.android.com/reference/android/os/AsyncTask.html)を読んでください。 – ataulm

+0

@ GabeSechan **ハニカム以降、並列実行**を指定できるというリンクを投稿しました。私は公式文書を誤解しましたか? – ataulm

答えて

2
yourAsyncTask.executeOnExecutor(yourThreadPoolExecutor, params); 

そして、あなたのプールのサイズを増やす:

yourThreadPoolExecutor.setMaximumPoolSize(size); 

は、スレッドの最大許容数を設定します。これはコンストラクタで設定された値をオーバーライドします。新しい値が現在の値より小さい場合、既存の余分なスレッドは、次にアイドルになると終了します。一例として

android.developer.com - ThreadPoolExecutor#setMaximumPoolSize(int)

android.developer.com - AsyncTask#executeOnExecutor(Executor, Params...)


yourThreadPoolExecutor = Executors.newCachedThreadPool(); 
yourThreadPoolExecutor.setMaximumPoolSize(256); 
yourAsyncTask.executeOnExecutor(yourThreadPoolExecutor, params); 
+0

デフォルトのスレッド数はどのくらいですか? – ataulm

+0

私はカスタムThreadPoolExecutorを実装する必要がありますか? @ataulm私はそれが128、またはCPU_COUNT * 2 + 1だと思います。この答えによると:http://stackoverflow.com/a/4072832/1177083 – 4ndro1d

+0

あなたはただ一つをインスタンス化することができます、何もカスタムを実装する必要はありません。 'AsyncTask.execute(Object ...) 'をクリックして、使用するものを指定していない場合はデフォルトのものを使用していることを確認してください。 – ataulm

関連する問題