0

我需要Handler一个以上的活动。

我可以让它像静态一样吗

public static Handler handler = new Handler();

或者我如何在不止一项活动中使用它?如果这个处理程序不能是静态的,我可以拥有多个处理程序吗?

我在读 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 必须是静态的,否则我会在另一个线程中得到一个异常,这不是一个好主意。

我发现的唯一问题是这个 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler 但正如它所提到的,只有当你发布一个长时间延迟的消息时。

于 2012-12-03T21:37:56.517 回答
1

Handler 只对已经初始化为 Looper 线程的线程有效。

UI 线程是 Looper 线程,大多数 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 中创建处理程序。据我所知,您必须为单独的活动创建单独的处理程序。

于 2012-12-03T16:15:28.600 回答