2012-10-12 5 views
21

私のコードを実行しているスレッドがUIスレッドかどうかを知るには、Androidには何か方法はありますか?スイングでは、私がUIスレッドにいるかどうかを教えてくれるSwingUtilities.isEventDispatchThread()がありました。私にこれを知らせる機能がAndroid SDKにありますか?ここから借りこのスレッドがUIかどうかを知る方法

+1

なぜあなたのコードが実行されているスレッドを知る必要がありますか?それがUIスレッド用のものであれば、そこにディスパッチするだけです。 –

+0

あなたは通常、メソッドがUIスレッドで実行されていることを知っています。特にあなたが疑うところがある場合はどうですか? – njzk2

+0

ケースは特にありません。私のマルチスレッドコードを確実に確認する方法です。 – user1730789

答えて

39
  1. 回答:How to check if current thread is not main thread

    Looper.myLooper() == Looper.getMainLooper()

  2. どれAndroidアプリは唯一のUIスレッドを持っているので、あなたがどこかのonCreateなどのアクティビティコールバックで()をチェックし、そのIDを保存でき、後でそのスレッドのIDと格納されているIDを比較するだけです。とにかく

    mMainThreadId = Thread.currentThread().getId();

  3. あなたはUIスレッド上で何かをして

    上で実行することが保証されて
    mActivity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
        ... 
        } 
    }); 
    

を使用しての活動への参照を持っているしたい場合は、チェックを省略することができますUIの場合は現在のスレッド、UIスレッドの場合はキューに入れられます。

0

実際にはAndroidアーキテクチャのため、すべてのアクティビティはメインスレッド、つまりUIスレッドで実行されます。だから、あなたがアクティビティをコーディングしているとき、あなたのアクティビティにあるものはすべてUIスレッドにあります。
ハニーコムでは、メインスレッドでネットワークコールを行っているときにエラーが追加されているため、UIが完全にブロックされます。

デフォルトでは、実際には常にUIスレッドで作業しています。 別のこと:明示的に他のスレッドにあることを要求しない限り、サービスはそのアプリケーションのアクティビティと同じスレッドで動作します。

だから、どうしたらいいですか?

  • アクティビティで重い計算が必要な場合は、 1つの解決策はAsyncTask(別のスレッドを簡単に使用できるように設計されたクラス)を使用することです。 onExecute()のコードは別のスレッドで実行されます(ただし、メインスレッドでpostExecuteが実行されるように注意してください)。もう1つは、AsyncTaskが実際には適応されていないときに手動で新しいスレッドを開始することです。
  • 高価なバックグラウンドタスクを実行するサービスを作成する場合は、マニフェストのandroid:process = ":my_process"属性を使用して別のスレッドで実行するようにします。この分離されたサービスと通信するには、AIDLを作成する必要がありますが、複雑な作業ではありません。
  • たとえば、MediaPlayerのような多くのオブジェクトには、メソッドのAsyncバリエーションがあります。常にそれらを使用するようにしてください。
-1

チェックしたいところにブレークポイントを設定し、ヒットしたら、UIと対話できるかどうか(つまり、UIがフリーズしていないかどうか)を確認します。 UIと対話できない場合はUIスレッドにあり、そうでない場合はバックグラウンドスレッドになります。

8

はい、方法があります。 メインスレッドのスレッドオブジェクトに対して現在のスレッドオブジェクトを確認します。メインルーパーは常にUIスレッド内にあります。

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
関連する問題