我正在编写一个运行与远程服务器通信的后台服务的应用程序。当服务器向我发送新消息时,我需要更新 UI 中表示的对象,然后更新 UI 视图以表示对象的新状态(例如,如果对象的背景属性为真 - 设置背景的视图为绿色,如果为假,则将视图的背景设置为红色)。
我正在使用列表视图来显示所有这些对象的所有 ArrayList 抛出一个 ArrayAdapter。
我有一个用于静态引用的 Application 对象(名为 app),并且我有一个 CurrentActivity 属性,用于存储当前正在运行的活动(如果 UI 关闭,则为 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();
}
});
}
尽管 Log 返回了正确的背景状态,但视图并没有通过 notifyDataSetChanged() 刷新;
我试图向 Activity throw BroadcastRecevier 发送消息,但它要复杂得多,因为我有很多来自服务器的消息,我将不得不注册许多接收器。此外 - 我不明白为什么接收器会工作而这个机制不会..
更新 ListView 的工作方法示例:
ListViewActivity - 从 BaseActivity 继承:
@Override
public void onUnFriend(FacebookUser facebookUser, boolean isYouRemovedClient)
{
super.onUnFriend(facebookUser, isYouRemovedClient);
updateView();
}
BaseActivity(继承Activity的超类):
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();
}
基本活动:
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);
}
没有更新……我真的不明白为什么……