0

我正在编写一个运行与远程服务器通信的后台服务的应用程序。当服务器向我发送新消息时,我需要更新 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);
}

没有更新……我真的不明白为什么……

4

2 回答 2

0

我有一个 CurrentActivity 属性,它存储当前正在运行的活动(如果 UI 关闭,则为 null)

我不推荐这种做法。它依赖于您一致且可靠地更新该Application数据成员,并且它增加了您的服务和您的 UI 之间的耦合。

尽管 Log 返回了正确的背景状态,但视图并没有通过 notifyDataSetChanged() 刷新;

您似乎没有更改适配器中的数据。当然,代码中没有证据表明您在此处更新了适配器中的数据。

顺便说一句,您在此处显示的代码片段都不太可能编译(第一个不是有效的 Java,第二个有错字)。

我有很多来自服务器的消息,我将不得不注册许多接收者

不,您必须注册一个接收者,并在onReceive()中使用if语句(或者switch,如果您愿意,也可以使用 )将一条消息与另一条消息区分开来。

于 2012-11-04T15:09:19.807 回答
0

除了 CommonsWare 所说的,我假设object您的第一行onNewMessage是视图。setBackround接受一个int参数,而不是一个boolean.

用于0xFF00FF00绿色和0xFFFF0000红色。

顺便说一句,保留Context对象及其派生类的静态引用是一种非常糟糕的做法(Application并且Activity都派生自Context,并且保留它们的静态引用可能会导致严重的内存泄漏。阅读更多here。)

改用 a BroadcastReceiver。与您描述它们的方式相比,它们要简单得多-您只需要一个。

于 2012-11-04T15:56:36.757 回答