【问题标题】:Changing UI from a service从服务更改 UI
【发布时间】:2014-05-21 18:02:40
【问题描述】:

我被服务的棘手问题所困扰,真的需要一些帮助。这里我有一个监听聊天消息并将其发送到 ListAdapter 的方法:

 @Override
 public void processPacket(Packet packet) {
     Handler mHandler = new Handler();
     Message message = (Message) packet;
     if (message.getBody() != null) {
         String fromName = StringUtils.parseBareAddress(message.getFrom());
         Log.i("XMPPChatDemoActivity ", " Text Recieved " + message.getBody() + " from " +  fromName);
         messages.add(fromName + ":");
         messages.add(message.getBody());

         // Add the incoming message to the list view
         mHandler.post(new Runnable() {
             public void run() {
                 setListAdapter();

这是我的 Listadapter:

public static void setListAdapter() {
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, messages);
    listview.setAdapter(adapter);
}

我需要聊天消息检索代码在永久服务中,并将消息发送到主活动,因为服务无法与 UI 交互。我知道处理程序可以胜任这项工作,但我越尝试,就越感到困惑。

【问题讨论】:

    标签: android service


    【解决方案1】:

    您可以使用Otto 之类的事件总线将更新从Service 传递到您的MainActivity

    就像 kcoppock 所说,您应该将消息保存在数据库中并使用ContentObserver 来跟踪更改。

    【讨论】:

    • 这看起来很酷!我有 asmack 库,它可以在其中工作吗?
    • 我不明白为什么不这样做。
    【解决方案2】:

    如果您将消息存储在数据库中,您还可以添加ContentProvider 并让您的Activity 注册ContentObserver 以进行更改。那么您的Service 将只负责更新数据库,如果 UI 可见,它将检测到更改。您可能最终只使用LocalBroadcastManager(在 v4 支持库中)来通知收到新消息时;但您仍应将消息永久保存在某个地方。

    【讨论】:

    • 这是我想的模式,但 Otto 库看起来确实不错。您的方法的优点是它不依赖于外部库。
    • 您将消息永久保存在某处是对的。我曾经使用LocalBroadcastmanager,但你需要添加BoardcastRecevier,测试起来很痛苦。 Otto 似乎带来了更多可重用的代码。
    • 是的,Otto 也很擅长这个。如果你走那条路,我可能会使用它而不是 LocalBroadcastManager,但我认为数据库是正确的解决方案(尽管实现的工作量绝对不小!)
    • 是的,这是我后来计划路由一个数据库来保存聊天消息,每条评论对我来说都是希望之光,希望两者都能接受,非常感谢大家
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多