我在写一个运行后台服务的应用程序,它与远程服务器进行通信。 当服务器向我发送一条新消息时,我需要更新UI中表示的对象,然后更新UI视图以表示对象的新状态(例如,如果对象的背景属性为真 - 设置视图的背景为绿色,如果为假,则将视图的背景设置为红色)。Android服务通信
我正在使用列表视图来显示所有这些对象的ArrayList抛出一个ArrayAdapter。
我有一个应用程序对象(名为应用程序)的静态引用,我有一个CurrentActivity属性存储当前活动正在运行(或null,如果用户界面已关闭)。
我正在使用此代码更新UI:
在我的服务:
onNewMessage(boolean backgruond)
{
if (app.getCurrentActivity != null)
app.getCurrentActivity.onNewMessage(background);
}
在我的活动
:
onNewMessage(boolean background)
{
object.setBackground(bacground);
Log.d("Background", String.valueof(background));
runOnUiThread(new Runnable() {
@Override
public void run()
{
arrayAdapter.notifyDataSetChanged();
}
});
}
,虽然日志返回正确的背景状态,该视图不会使用notifyDataSetChanged()刷新;
我试图发送消息给Activity抛出BroadcastRecevier,但它更复杂,因为我有很多来自服务器的消息,我将不得不注册很多接收者。 再说 - 我不明白为什么会recevier工作,而这个机制不会..工作方法的
例子更新的ListView:
ListViewActivity - 继承自BaseActivity:
@Override
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient)
{
super.onUnFriend(facebookUser, isYouRemovedClient);
updateView();
}
BaseActivity(超类延伸活动):
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient)
{
facebookUser.setApplicationFriend(false);
app.getApplicationFriends().remove(facebookUser);
app.getDatabaseManager().deleteApplicationFriend(facebookUser.getId());
if (isYouRemovedClient)
app.showToast(facebookUser.getName() + " has removed from your friends", true);
else
app.showToast(facebookUser.getName() + " has removed you from friends", true);
}
这一项工作,它改变背景ListView中的颜色。
不灵例如 ListViewActivity:
@Override
public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog) {
super.onFriendRequestAccepted(facebookUser, showDialog);
updateView();
}
BaseActivity:
public void onFriendRequestAccepted(FacebookUser facebookUser, boolean showDialog)
{
facebookUser.setApplicationFriend(true);
app.getApplicationFriends().add(facebookUser);
app.getDatabaseManager().addApplicationFriend(facebookUser);
if (showDialog)
app.showNewEventActivity(facebookUser, EventDialogManager.EVENT_FRIEND_ACCEPTED);
}
不进行更新......我真的不能明白为什么..
我已经显示的代码片段仅仅是我为这个问题写的一个例子..我确实改变了适配器中的数据 - 我已经改变了属性indside我的对象 - 这个对象是在里面的arraylist这个adpter –
我不是说他们是无用的 - 他们应该证明我的问题... –
但是 - 不notifyOnDataSetChanged应该更新视图,如果对象属性已更改? –