服务中运行了一些线程。 线程需要将消息发布到UI / Activity
如何将Handler引用传递给线程?这样他们就可以将状态更改发布到Activity?
或者更好的是有没有办法像这样全局公开处理程序引用?
Handler getUIHandler();
提前谢谢你;)
答案 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);
}
}