Android服务通讯

时间:2012-11-04 14:29:54

标签: android listview service

我正在编写一个运行后台服务的应用程序,该服务与远程服务器通信。 当服务器向我发送新消息时,我需要更新UI中表示的对象,然后更新UI视图以表示对象的新状态(例如,如果对象的背景属性为true - 设置背景视图为绿色,如果为false,则将视图背景设置为红色。

我正在使用列表视图来显示所有这些对象的所有ArrayList抛出一个ArrayAdapter。

我有一个Application对象(名为app)用于静态引用,我有一个CurrentActivity属性存储当前活动正在运行(如果UI关闭,则为null)。

我正在使用此代码更新用户界面:

在我的服务中:

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();
}

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);
}

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

2 个答案:

答案 0 :(得分:0)

  

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

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

  

虽然Log返回正确的背景状态,但是视图没有使用notifyDataSetChanged()进行刷新;

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

BTW,你在这里展示的代码片段都不可能编译(首先是无效的Java,第二个有拼写错误)。

  

我有很多来自服务器的消息,我将需要注册许多接收器

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

答案 1 :(得分:0)

除了CommonsWare所说的内容之外,我假设object的第一行中的onNewMessage是视图。 setBackround接受int参数,而不是boolean

0xFF00FF00用于绿色,将0xFFFF0000用于红色。

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

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