0

Handler複数のアクティビティが必要です。

のように静的にすることはできますか

public static Handler handler = new Handler();

または、複数のアクティビティでどのように使用できますか? このハンドラーを静的にできない場合、複数のハンドラーを使用できますか?

ハンドラーは静的でなければならないことを読んでいました。そうしないと、別のスレッドで例外が発生し、これはお勧めできません。

どの方法が正しいですか?

4

4 に答える 4

1
I need Handler in more then one Activity

なぜあなたは活動ごとにハンドラーを作成しないのですか?

または、複数のアクティビティでどのように使用できますか?

アクティビティごとに作成するだけで、すべて同じLooperオブジェクトにバインドする必要があります

ドキュメントから:

When you create a new Handler, it is bound to the thread / message queue of the thread that is `creating it`

これを静的にできない場合、複数のハンドラーを使用できますか?

承知しました

ハンドラーは静的でなければならないことを読んでいました。そうでないと、別のスレッドで例外が発生し、これはお勧めできません。

私が見つけた唯一の問題は、 このHandlerクラスが静的であるか、リークが発生する可能性があることでした:IncomingHandler ですが、前述のように、長い遅延メッセージを投稿した場合のみです。

于 2012-12-03T21:37:56.517 に答える
1

ハンドラは、ルーパー スレッドとして初期化されたスレッドに対してのみ有効です。

UI スレッドはルーパー スレッドであり、ほとんどの Android コンポーネントは UI スレッドで実行されます。たとえば、アクティビティ、サービス、コンテンツ プロバイダー、カスタム アプリケーション クラスなど、UI スレッドでインスタンス化するすべてのクラスが含まれます。

ハンドラーを作成する代わりに、以下を使用できます。

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )

ただし、代わりにメッセージを使用する場合は、ハンドラーを使用する必要があります。

ハンドラーを静的にするように警告する lint エラーが発生した場合、代わりに静的なネストされたクラスを使用することを意味するため、場合によっては問題を引き起こす可能性のある外部クラスとそのすべてのメンバーへの暗黙的な参照を取得しません。この警告を回避するために、次のようにハンドラーを宣言できます。

static  MyHandler extends Handler { 
    // TODO: implement message handling, etc here
}

private mHandler = new MyHandler();
于 2012-12-03T22:17:22.290 に答える
0

実装がスレッド セーフであるか、プログラムがシングル スレッド環境で実行されている場合Handlerは、複数のイベント/アクティビティを次々に処理する単一のハンドラ インスタンスを作成し、それを静的として宣言することができます。

スレッドセーフでない場合、マルチスレッド環境で複数のアクティビティ/イベントに同じハンドラー インスタンスを使用すると、予期しない結果が発生します。

于 2012-12-03T16:14:26.250 に答える
0

ハンドラーは常に静的です。Activity の onCreate で Handler を作成する必要があります。私の知る限り、個別のアクティビティに対して個別のハンドラーを作成する必要があります。

于 2012-12-03T16:15:28.600 に答える