我有一个IntentService,它在WindowManager的帮助下创建了一个Overlay。在WindowManager中,我添加了一个包含ListView的View。现在我想在onHandleIntent方法中向ListView添加一个新项目但是如果我调用
data.add("String");
adapter.notifyDataSetChanged();
系统抛出错误
Only the original thread that created a view hierarchy can touch its views.
我该怎么做才能防止这种情况发生?
答案 0 :(得分:1)
屏幕只能由UI线程更新。服务无法保证它在UI线程中运行。因此,服务可能无法直接更新屏幕。
解决方案是向UI线程发送消息。有很多方法可以做到这一点。这是一个:
在onCreate()中为附加到屏幕的Activity创建一个消息处理程序:
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message inputMessage) {
Update the UI here using data passed in the message.
}
}
使mHandler可用于服务(可能通过StartService()中使用的意图。
在服务中将消息发送给处理程序:
Message msg = mHandler.obtainMessage(...);
... add info to msg as necessary
msg.sendToTarget();
这些页面可能有助于详细说明:
http://developer.android.com/reference/android/os/Handler.html
和
http://developer.android.com/reference/android/os/Message.html
答案 1 :(得分:0)
您可以通过让持有ListView的Activity进行更新来解决此问题。 Activity.runOnUiThread()应该做的工作=]