如何在应用程序周围访问Handler

时间:2012-11-13 21:02:10

标签: android

服务中运行了一些线程。 线程需要将消息发布到UI / Activity

如何将Handler引用传递给线程?这样他们就可以将状态更改发布到Activity?

或者更好的是有没有办法像这样全局公开处理程序引用?

   Handler getUIHandler();

提前谢谢你;)

3 个答案:

答案 0 :(得分:0)

在UI线程中创建一个Handler对象。如果您愿意,可以在实例化时创建它。从您的活动启动的任何线程都可以将消息或runnable发布到该处理程序。从其他活动,服务或诸如此类推出的线程将无法工作,因为无法保证您的Activity甚至正在运行。 (实际上,在Activity运行时查看它是否有效可能是一个有趣的实验,但你永远不可能在这个技术上建立一个真正的应用程序。)

实际上,您甚至不需要创建Handler。每个View对象都包含自己的Handler,因此您只需将runnable发布到视图中即可。

或者您可以致电runOnUiThread()

从我对处理程序的说明:

使用模式:

模式1,处理程序加运行:

// Main thread
private Handler handler = new Handler()

  ...

// Some other thread
handler.post(new Runnable() {
  public void run() {
    Log.d(TAG, "this is being run in the main thread");
  }
});

模式2,处理程序加消息:

// Main thread
private Handler handler = new Handler() {
  public void handleMessage(Message msg) {
    Log.d(TAG, "dealing with message: " + msg.what);
  }
};

  ...

// Some other thread
Message msg = handler.obtainMessage(what);
handler.sendMessage(msg);

模式3,调用runOnUiThread():

// Some other thread
runOnUiThread(new Runnable() {      // Only available in Activity
  public void run() {
    // perform action in ui thread
  }
});

模式4,使用View的内置处理程序:

// Some other thread
myView.post(new Runnable() {
  public void run() {
    // perform action in ui thread, presumably involving this view
  }
});

答案 1 :(得分:0)

我已经回答了一个关于如何在服务中向活动报告错误的类似问题。

检查Best practice for error handling in an Android Service,这将为您提供方法以及您可以使用的代码示例。

问候。

答案 2 :(得分:0)

好的,也许我们应该回到基本问题。您是否尝试通过该服务在活动中进行UI更新?我看到了两种方法。

首先,您的服务可以将特殊意图发送回活动。使用“singleTask”的启动模式声明活动,并实现onNewIntent()以从服务接收意图。然后,将任何相关信息打包到意图中,并将其发送到要处理的活动。

更好的方法,但有点复杂,是将服务绑定到活动,然后他们可以轻松地通过绑定器相互通信。如果服务和活动都是同一个应用程序的一部分,并且都在同一个进程中运行,那么这就变得更加简单了。

再次,从我的笔记:

声明一个名为eg的内部类“LocalBinder”扩展了Binder并包含一个名为例如getService()返回服务的实例:

public class MyService extends Service
{
  public class LocalBinder extends Binder {
    MyService getService() {
      return MyService.this;
    }
  }

  private final IBinder binder = new LocalBinder();

  public IBinder onBind(Intent intent) {
    return binder;
  }
}

您的活动包含的代码如下:

// Subclass of ServiceConnection used to manage connect/disconnect
class MyConnection extends ServiceConnection {
  public void onServiceConnected(ComponentName name, IBinder svc) {
    myService = ((MyService.LocalBinder)svc).getService();
    // we are now connected
  }
  public void onServiceDisconnected(ComponentName name) {
    // we are now disconnected
    myService = null;
  }
}

private MyService myService;
private MyConnection connection = new MyConnection();

/**
 * Bind to the service
 */
void doBind() {
  bindService(new Intent(MyClient.this, MyService.class),
    connection, Context.BIND_AUTO_CREATE);
}

/**
 * Unbind from the service
 */
void doUnbind() {
  if (connection != null) {
    unbindService(connection);
  }
}