2016-04-07 1 views
2

1.私のアンドロイドアプリケーションで10以上のAsynctaskが利用可能です。複数の非同期タスクを呼び出すための最良の方法アンドロイドでサーバーからローカルにデータを取得する

2.サーバーからローカルDBにデータを取得するために使用します。

私は分離クラスで非同期タスクを維持しました。

私は以下のように同時に呼び出すことはできますか?それは、問題を作成し、同期してローカルデータベースに挿入するか、私に他の解決策を提案します。

MY CODE:

if (isInternetPresent) 
{ 

    new AsyncTaskSync_MappingTableClass1(MainActivity.this).execute(); 

    new AsyncTaskSync_MappingTableClass2(MainActivity.this).execute(); 

    new AsyncTaskSync_MappingTableClass3(MainActivity.this).execute(); 

    new AsyncTaskSync_MappingTableClass4(MainActivity.this).execute(); 
    } 
    else 
    { 
    Log.i("INFO"," No Internet.. :-("); 
    } 
+0

asynctaskの代わりにrunnableインターフェイスを使用して、使用できるjoinメソッドを使用することもできます。 –

答えて

2

Android Executorsを使用することをお勧めします。これは、以前のものが実行されている間、あなたのスレッドを保持するいくつかのインターフェイスです。

たとえば、ユーザー10スレッドランナブル(AsyncTask)。しかし、あなたが理解すると、それは10スレッドを実行する - それは悪い考えです。だから、あなたは3つのスレッドだけのためのメモリスペースを作成し、デバイスのパフォーマンスを保存したい。だから最初の3つのスレッドを実行するインターフェイスを使用する必要があります!いくつかのスレッドが実行されると、あなたは次を実行するよりも。

更新! スレッド(10,100 ....)をすべて追加するだけで、エグゼキュータがメモリ内のすべてのタスクを正しく管理できます。もう一つのコンストラクタTheadPoolがあります。詳細については、ドキュメントを参照してください。乾杯!

例:

List<AsyncTask> listTask = new ArrayList<>(); 
.... 
//Add all your runnables interfaces 

Executor ex = ThreadPoolExecutor.newFixedThreadPool(3); 

//Number of active threads - 3 

for (int i = 10; i < 10; i++) { 
ex.execute(listTask.get(i)); 
} 

もう一つの例: 正直なところ、AsyncTaskは、それがバックグラウンド作業のための最善の解決策ではありません。したがって、エグゼキュータはRunnableインターフェイスをサポートします。だからあなたは、JavaスレッドとRunnableのインターフェイスとアンドロイドExecutorsについて読む必要があり、毎回最良の解決策になるでしょう。使用Retrofit、RxJava、Volleyおよび他の実現。しかし、Javaのネイティブメソッドは、最も単純で安定しています。

最終更新日! this resource, to read moreにアクセスしてください。

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class SimpleThreadPool extends Activity { 

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

     ExecutorService executor = Executors.newFixedThreadPool(5); 
     for (int i = 0; i < 10; i++) { 
      Runnable worker = new WorkerThread(String.valueOf(i)); 
      executor.execute(worker); 
      } 
     executor.shutdown(); 
     while (!executor.isTerminated()) { 
     } 
     System.out.println('Finished all threads'); 
    } 

} 


public class WorkerThread implements Runnable { 

    private String command; 

    public WorkerThread(String s){ 
     this.command=s; 
    } 

    @Override 
    public void run() { 
     System.out.println(Thread.currentThread().getName()+' Start. Command = '+command); 
     processCommand(); 
     System.out.println(Thread.currentThread().getName()+' End.'); 
    } 

    private void processCommand() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String toString(){ 
     return this.command; 
    } 
} 

結果前のコード。

pool-1-thread-2 Start. Command = 1 
pool-1-thread-4 Start. Command = 3 
pool-1-thread-1 Start. Command = 0 
pool-1-thread-3 Start. Command = 2 
pool-1-thread-5 Start. Command = 4 
pool-1-thread-4 End. 
pool-1-thread-5 End. 
pool-1-thread-1 End. 
pool-1-thread-3 End. 
pool-1-thread-3 Start. Command = 8 
pool-1-thread-2 End. 
pool-1-thread-2 Start. Command = 9 
pool-1-thread-1 Start. Command = 7 
pool-1-thread-5 Start. Command = 6 
pool-1-thread-4 Start. Command = 5 
pool-1-thread-2 End. 
pool-1-thread-4 End. 
pool-1-thread-3 End. 
pool-1-thread-5 End. 
pool-1-thread-1 End. 
Finished all threads 
+0

ありがとう、このコードを追加できますか?リトルブリーフィングと非同期タスククラス? – Kumar

+0

コードにエラーが発生しました - メソッドnewfixedthreadpoolを解決できません – Kumar

+0

@Kumar私はメモリから書きました。他の例を更新してください。そのすべてについてもっと読む。 – GensaGames

1

最良の方法は、次々に呼び出しonPostExecute()メソッドでは連続したタスクを呼び出すことです。インタフェースコールバックを使用します。

+0

インターフェイスコールバックの実装方法 – Kumar

+0

@PrithvirajShiroorそれは悪い解決策です。 – GensaGames

+0

@Kumar必要なメソッドを持つインターフェイスを作成し、コールバックを受け取るクラスで実装します。クラスのオブジェクトを作成し、ここに示すように結果を設定するメソッドに渡します。[[リンク](http://web.deu.edu.tr/doc/oreily/java/exp/ch05_08.htm) –

関連する問題