0

我有一个 IntentService,它在 WindowManager 的帮助下创建了一个 Overlay。在 WindowManager 中,我添加了一个包含 ListView 的视图。现在我想在 onHandleIntent 方法中向 ListView 添加一个新项目,但是如果我调用

data.add("String");
adapter.notifyDataSetChanged();

系统抛出错误

Only the original thread that created a view hierarchy can touch its views.

我能做些什么来防止这种情况发生?

4

2 回答 2

1

屏幕只能由 UI 线程更新。服务不能保证它在 UI 线程中运行。因此,服务可能不会直接更新屏幕。

解决方案是向 UI 线程发送消息。有很多方法可以做到这一点。这是一个:

在附加到屏幕的 Activity 的 onCreate() 中,创建一个消息处理程序:

  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

于 2013-03-19T17:44:32.693 回答
0

您可以通过让包含 ListView 的 Activity 进行更新来解决此问题。Activity.runOnUiThread()应该做的工作=]

于 2013-03-19T17:28:33.553 回答