1

有几个线程在服务中运行。线程需要向 UI / Activity 发布消息

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

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

   Handler getUIHandler();

先感谢您 ;)

4

3 回答 3

0

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

检查Android Service 中错误处理的最佳实践,这将为您提供方法以及您可以使用的代码示例。

问候。

于 2012-11-13T22:40:38.897 回答
0

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

实际上,您甚至不需要创建 Handler。每个 View 对象都包含自己的 Handler,因此您可以简单地将可运行文件发布到视图。

或者你可以打电话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
  }
});
于 2012-11-13T21:59:43.243 回答
0

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

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

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

同样,从我的笔记中:

声明一个名为“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);
  }
}
于 2012-11-14T16:34:11.760 回答