2012-03-27 4 views
1

の拡張:私はちょうど公式Androidのサイト上で、次のコードを発見したIntentServiceクラスに

@Override 
    protected void onHandleIntent(Intent intent) { 
     // Normally we would do some work here, like download a file. 
     // For our sample, we just sleep for 5 seconds. 
     long endTime = System.currentTimeMillis() + 5*1000; 
     while (System.currentTimeMillis() < endTime) { 
      synchronized (this) { 
       try { 
        wait(endTime - System.currentTimeMillis()); 
       } catch (Exception e) { 
       } 
      } 
     } 
    } 

をし、また、私は、次の論文を読んで:

  • はに配信すべての意図を実行し、デフォルトのワーカースレッドを作成します。アプリケーションのメインスレッドとは別のonStartCommand()。
  • 一度に1つのインテントをonHandleIntent()実装に渡す作業キューを作成するので、マルチスレッドについて心配する必要はありません。

IntentServiceがワーカースレッドを使用していて、マルチスレッド化について心配する必要がない場合、なぜonHandleIntent(...)メソッドでブロックを同期させる必要があるのですか?ありがとうございました。

答えて

1

IntentServiceがワーカースレッドを使用していて、マルチスレッド化について心配する必要がない場合、なぜonHandleIntent(...)メソッドでブロックを同期させる必要があるのですか?

IntentServiceワーカースレッドです。 onHandleIntent()がそのスレッドで呼び出されます。

しかし、ライフサイクルメソッド(onCreate()onStartCommand()onBind()onDestroy()、等)がメインアプリケーションスレッド上で呼び出されます。

ワーカースレッドとメインアプリケーションスレッドの両方から使用しようとしているオブジェクトがある場合、それらのアクセスを1つまたは複数の方法で同期する必要があります。

あなたの引用したコードサンプルは奇妙なものですが、Googleがなぜそれを使用しているのかわかりません。寝る必要がある場合(プロダクションアプリでは珍しい)、SystemClock.sleep()を使用してください。

+0

ありがとうございました。 – user1166635

関連する問題