2016-04-06 15 views
0

1つの非同期タスクでスレッドをスリープさせたいとします。1つの非同期タスクのスレッドスリープは、アプリケーション内の他の非同期タスクを一時停止します。

コード:

protected Weather doInBackground(Void... params) { 
     try { 
       Thread.sleep(10000); 
      } catch (Exception ex) { 

      } 
} 

これは、一時停止するアプリケーションの他の非同期タスクが発生します。どうして? 私の意図は、スレッドを一時停止するのではなく、ネットワークコールに時間がかかるため、アプリケーション内のすべての非同期タスクが一時停止します。

この問題を解決するにはどうすればよいですか?

これは私が非同期タスク

WeatherAsync weatherAsync = new WeatherAsync(Pref.getString(getApplicationContext(), Pref.local.WEATHER_CITY), null, null, 
       new WeatherAsync.WeatherAsyncCallback() { 
        @Override 
        public void onCancelled() { 

        } 

        @Override 
        public void onPreExecute() { 

        } 

        @Override 
        public void onPostExecute(Weather result) { 
         if (result == null) { 
          return; 
         } 
         Log.d("Temp", "" + result.getTemp()); 
         //adapter.addWeather(new NavigationDrawerItem(result, NavigationDrawerItem.WEATHER_VIEW)); 
        } 
       }); 
     weatherAsync.execute(); 

答えて

1

AsyncTask APIドキュメントを呼んでいる方法ですが、次の言葉:

最初に導入され、AsyncTasksが単一のバックグラウンドスレッド上で逐次実行されたとき。 DONUTから始めて、これはスレッドのプールに変更され、複数のタスクを並列に動作させることができました。 HONEYCOMBを開始すると、タスクは1つのスレッド上で実行され、並列実行によって発生する一般的なアプリケーションエラーを回避します。

つまり、比較的近代的なAndroidを実行している場合、AsyncTaskは同じスレッドで起きています。 APIドキュメントから継続するには:あなたは本当に並列実行したい場合は

することは、あなたはTHREAD_POOL_EXECUTORでexecuteOnExecutor(java.util.concurrent.Executor、オブジェクト[])を呼び出すことができます。

これは、Androidでマルチスレッドの作業を行う単なる方法の1つです。あなたはマルチスレッドを実現するために、普通の古いスレッドを同様に行うことができます。

+0

ありがとう、私はこれを知らなかった。私は4つのfragmnetsをロードするビューページャを持っています。そのうち2つはメインアクティビティで合計4つのasycタスクを実行します。もしそれらがつまってしまったら、すべてが固まってしまいます。この問題と戦うには? –