可以是处理程序静态与否

时间:2012-12-03 16:09:09

标签: android

我需要Handler多个活动。

我可以像

那样保持静态
public static Handler handler = new Handler();

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

我正在读取Handler必须是静态的,否则我会在另一个线程中得到一个异常,这不是一个好主意。

哪种方式正确?

4 个答案:

答案 0 :(得分:1)

I need Handler in more then one Activity

为什么你不为每个活动创建一个处理程序?

  

或者如何在多个活动中使用它?

只需为每个活动创建它们,它们都应绑定到相同的Looper对象

来自docs:

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

如果这个处理程序不能是静态的,我可以拥有多个处理程序吗?

确定

  

我读到Handler必须是静态的,否则我会得到一个   另一个线程中的异常,这不是一个好主意。

我发现的唯一问题是这个 This Handler class should be static or leaks might occur: IncomingHandler 但正如提到的那样,只有当你发布一条很长的延迟信息时才会这样。

答案 1 :(得分: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();

答案 2 :(得分:0)

如果您的Handler实现是线程安全的,或者您的程序在单线程环境中运行,那么您可以拥有一个处理器实例,它将一个接一个地处理多个事件/活动,因此将其声明为静态。

如果它不是线程安全的,那么如果在多线程环境中对多个活动/事件使用相同的处理程序实例,则会看到意外的结果。

答案 3 :(得分:0)

处理程序始终是静态的。您必须在onCreate of Activity中创建处理程序。据我所知,您必须为单独的活动创建单独的处理程序。