从IntentService更新ListView

时间:2013-03-19 17:23:42

标签: android multithreading intentservice

我有一个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.

我该怎么做才能防止这种情况发生?

2 个答案:

答案 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()应该做的工作=]