从Android服务更新我的活动中的列表视图

7

我有两个类:

1. Activity类

2. Service类

当服务端获得更新时,我需要在我的活动中更新我的列表视图。实际上,我像一个聊天应用程序一样尝试着使我的服务一直检查我的数据库。如果它获得了任何新的字符串,我需要在不重新构建的情况下刷新列表视图。我发现可以使用iBinder来操作它,但我不知道如何使用它。可以有人给我一些代码示例吗?

参考页面

3个回答

4

建议使用绑定服务。在我的应用程序中,我也做了类似的事情。当点击刷新时,我会调用一个服务,在后台获取数据并更新UI。

请查看我的服务: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override
protected void onPostExecute(AnalyticsAccountResult result) {
    super.onPostExecute(result);
    App.getEventBus().post(result);
}

Activity: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe
public void UpdateUI(AnalyticsAccountResult result) {
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress);
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout);
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage);

    switch (result.getStatus()) {
        case STARTING:
        statusMessage.setVisibility(View.GONE);
        progressbar.setVisibility(View.VISIBLE);
        spinnerLayout.setVisibility(View.GONE);
        break;

        case FAILURE:
        statusMessage.setVisibility(View.VISIBLE);
        progressbar.setVisibility(View.GONE);
        spinnerLayout.setVisibility(View.GONE);
        statusMessage.setText(result.getErrorMessage());
        break;

        case SUCCESS:
        statusMessage.setVisibility(View.GONE);
        progressbar.setVisibility(View.GONE);
        spinnerLayout.setVisibility(View.VISIBLE);

        if (result.getItems() != null)
        {
            this.acProfiles = result.getItems();
            MyAdapter myAdapter = new MyAdapter(acProfiles, this);
            listView.setAdapter(myAdapter);
            UpdateSelectionPreferences();
            if (result.isPersist() && acProfiles.size() > 0)
            {
                if (App.LOCAL_LOGV)
                Log.v(App.TAG, "saving configdata");        
                try
                {
                    appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName());
                }
                catch (JsonProcessingException e)
                {
                    Log.e(App.TAG, e.getMessage());
                }
            }
        }
        break;
    }
}

使用Otto库也会很有帮助:
http://square.github.io/otto/


3

假设你有一个名为MainActivity的活动类,在其中使用名为listviewAdapter的适配器初始化了你的ListView。将以下代码放入MainActivity中:

  public static Handler UIHandler;

    static {
        UIHandler = new Handler(Looper.getMainLooper());
    }

    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable); 
    }

当你在服务类中修改了列表视图数据时,使用以下代码将新数据应用于ListView:

MainActivity.runOnUI(new Runnable()
{
    public void run()
    {
        try
        {
            MainActivity.listviewAdapter.notifyDataSetChanged();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
});

这很好,目前可以工作,但我担心之后会出现一些与线程相关的异常:/ - Reda

0

没有更多信息,我无法提供任何有用的代码示例,但我认为您可能正在寻找的是ListAdapter。 ListAdapter接受listview和数据集(在您的情况下可能是字符串数组)并将两者组合在一起。每当数据集更改时(在您的情况下,当服务检测到新字符串并将其添加到数组中时),只需调用ListAdapter.notifyDataSetChanged(),listview 将自动使用您的新信息进行更新。 请检查http://developer.android.com/reference/android/widget/ArrayAdapter.html了解您可能使用的特定ListAdapter的更多信息。


1
谢谢您的回复,其实您说得对。但我的问题是如何知道数据集从我的活动中更改了。我应该如何从我的服务中得到通知? - GK_
我个人没有做过这个,所以不能确定哪种方法是最好的,但我认为一个BroadcastReceiver对你来说应该是可行的。它是一个抽象类,可以处理由服务广播的消息。当服务发现新字符串时,它将使用其sendBroadcast()方法,您的活动将被注册为BroadcastReciever,当接收到广播时将执行某些操作。 - takendarkk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接