Android 从服务更改UI
我坚持服务的棘手之处,真的需要一些帮助。这里我有一个方法,可以侦听聊天消息并将其发送到ListAdapter: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
@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,但我认为数据库是合适的解决方案(尽管实现起来肯定是一项非常艰巨的工作!)是的,这是我的上级计划路由一个数据库来保存聊天信息,每一条评论对我来说都是希望之光,希望可以接受这两个,谢谢大家