从android服务更新我的活动中的listview

从android服务更新我的活动中的listview,android,android-service-binding,Android,Android Service Binding,我有两门课 1.活动课 2.服务级别 当服务得到任何更新时,我需要在我的活动中更新我的列表视图。 事实上,我像一个聊天应用程序一样尝试,我的服务总是检查我的数据库,如果它得到任何新字符串,我需要在我的活动中更新,而不需要再次重建,我只需要刷新列表视图。我发现它将被操纵使用iBinder,但我不知道如何使用它。有人能给我推荐一些代码示例吗 您应该使用绑定服务。我在申请表中做了类似的事情。单击refresh,我调用一个服务,该服务在后台获取数据并更新UI 在这里查看我的服务: 活动: 使用Ott

我有两门课

1.活动课

2.服务级别

当服务得到任何更新时,我需要在我的活动中更新我的列表视图。 事实上,我像一个聊天应用程序一样尝试,我的服务总是检查我的数据库,如果它得到任何新字符串,我需要在我的活动中更新,而不需要再次重建,我只需要刷新列表视图。我发现它将被操纵使用iBinder,但我不知道如何使用它。有人能给我推荐一些代码示例吗


您应该使用绑定服务。我在申请表中做了类似的事情。单击refresh,我调用一个服务,该服务在后台获取数据并更新UI

在这里查看我的服务:

活动:

使用Otto库也很有帮助:

如果没有更多信息,我无法提供任何有用的代码示例,但是我认为您可能需要的是ListAdapter。ListAdapter接受一个listview和一个dataset(在您的示例中,可能是一个字符串数组),并将这两个元素组合在一起。每当数据集发生更改时(在您的情况下,就是当您的服务检测到一个新字符串并将其添加到数组中时),您只需调用ListAdapter.notifyDataSetChanged(),listview就会自动更新为您的新信息。
检查有关可能使用的特定ListAdapter的更多信息。

假设您有名为MainActivity的活动类,在该类中,您使用名为listviewAdapter的适配器初始化了ListView。将此代码放入MainActivity中:

  public static Handler UIHandler;

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

    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable); 
    }
在服务类中更改listview数据时,请编写以下代码以将新数据应用于listview:

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

谢谢你的回答,……事实上你是对的。但我的问题是,我如何知道我的活动中的数据发生了变化……我应该如何从我的服务中得到暗示。?我不必亲自这么做,所以我不能确定哪种方法是最好的,但我认为a适合你。它是一个抽象类,可以处理服务广播的消息。服务在找到新字符串时将使用其sendBroadcast()方法,并且您的活动将注册为BroadcastReceiver,当接收到广播时将执行一些操作。这很好,目前正在运行,但我担心在以下情况后会出现一些与线程相关的异常:/
  public static Handler UIHandler;

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

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