Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从服务更改UI_Android_Service - Fatal编程技术网

Android 从服务更改UI

Android 从服务更改UI,android,service,Android,Service,我坚持服务的棘手之处,真的需要一些帮助。这里我有一个方法,可以侦听聊天消息并将其发送到ListAdapter: @Override public void processPacket(Packet packet) { Handler mHandler = new Handler(); Message message = (Message) packet; if (message.getBody() != null) { String fromN

我坚持服务的棘手之处,真的需要一些帮助。这里我有一个方法,可以侦听聊天消息并将其发送到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);
}
公共静态void setListAdapter(){
ArrayAdapter=新的ArrayAdapter(此,R.layout.listitem,消息);
setAdapter(适配器);
}

我需要聊天消息检索代码在永久服务中,并将消息发送到主活动,因为服务无法与UI交互。我知道是由处理程序来完成这项工作,但我越试越糊涂。

您可以使用类似事件总线的方式,从
服务
向您的
main活动
发送更新


正如KCopock所说,您应该将消息持久保存在数据库中,并使用
ContentObserver
跟踪更改。

您可以使用类似事件总线的方式从
服务向
MainActivity
发送更新


正如KCopock所说,您应该将消息持久保存在数据库中,并使用
ContentObserver
跟踪更改。

如果您选择将消息存储在数据库中,您还可以添加
ContentProvider
,并让您的
活动
注册
ContentObserver
以进行更改。然后,您的
服务将只负责更新数据库,如果用户界面可见,它将检测更改。您可能只需要使用
LocalBroadcastManager
(在v4支持库中)在收到新消息时进行通知;但是您仍然应该将消息永久保存在某个位置。

如果您选择将消息存储在数据库中,您还可以添加一个
ContentProvider
,并让您的
活动
注册一个
ContentObserver
以进行更改。然后,您的
服务将只负责更新数据库,如果用户界面可见,它将检测更改。您可能只需要使用
LocalBroadcastManager
(在v4支持库中)在收到新消息时进行通知;但是你仍然应该将这些消息永久保存在某个地方。

这看起来很酷!我有一个mack库它在里面工作吗?我不明白为什么不。这个看起来很酷的人!我有一个标记库,它在里面工作吗?我不明白为什么不工作。这是我在想的模式,但是奥托库看起来不错。您的方法的优点是它不依赖于外部库。您将消息持久化到某个永久位置的想法是正确的。我曾经使用过
LocalBroadcastmanager
,但是你需要添加一个
BoardcastRecevier
,这是一个很难测试的问题。Otto似乎带来了更多可重用的代码。是的,Otto在这方面也很好。如果你这样做的话,我可能会用它来代替LocalBroadcastManager,但我认为数据库是合适的解决方案(尽管实施起来肯定是一项非常艰巨的工作!)是的,这是我的上级计划路由一个数据库来保存聊天信息,每一条评论对我来说都是希望之光,希望我能接受这两个,多谢各位,这是我一直在想的模式,但奥托图书馆看起来确实不错。您的方法的优点是它不依赖于外部库。您将消息持久化到某个永久位置的想法是正确的。我曾经使用过
LocalBroadcastmanager
,但是你需要添加一个
BoardcastRecevier
,这是一个很难测试的问题。Otto似乎带来了更多可重用的代码。是的,Otto在这方面也很好。如果你这样做的话,我可能会用它来代替LocalBroadcastManager,但我认为数据库是合适的解决方案(尽管实现起来肯定是一项非常艰巨的工作!)是的,这是我的上级计划路由一个数据库来保存聊天信息,每一条评论对我来说都是希望之光,希望可以接受这两个,谢谢大家