从服务更新`RecyclerView`数据集

时间:2016-07-21 12:34:24

标签: android broadcastreceiver android-service

如何从后台服务更新RecyclerView Dataset。 该服务维护与服务器的套接字连接,当服务器响应数据时,service必须在recyclerview中(即MainActivity中)更新它。

2 个答案:

答案 0 :(得分:2)

有许多方法可以将事件从Serivce发送到Activity 我推荐你以下方式。

绑定和回调

我认为Bind和Callbacks是官方的方式 Communication between Activity and Service
Example: Communication between Activity and Service using Messaging

<强> EventBus

我认为EventBus很简单 https://github.com/greenrobot/EventBus

在活动中(或任何地方):

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

    @Override
    protected void onResume() {
        super.onResume();
        BusHolder.getInstnace().register(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        BusHolder.getInstnace().unregister(this);
    }

    @Subscribe
    public void onDatasetUpdated(DataSetUpdatedEvent event) {
        //Update RecyclerView
    }
}

BusHolder持有BusEvent实例:

public class BusHolder {

    private static EventBus eventBus;

    public static EventBus getInstnace() {
        if (eventBus == null) {
            eventBus = new EventBus();
        }
        return eventBus;
    }

    private BusHolder() {
    }
}

活动发布:

public class DataSetUpdatedEvent {
    //It is better to use database and share the key of record of database.
    //But for simplicity, I share the dataset directly.
    List<Data> dataset;

    public DataSetUpdatedEvent(List<Data> dataset) {
        this.dataset = dataset;
    }
}

从您的服务发送消息。

BusHolder.getInstnace().post(new DataSetUpdatedEvent(dataset));

我希望这会有所帮助。

答案 1 :(得分:0)

可能你应该使用类似数据库来存储临时数据,因为我认为代表服务组件将数据存储在对象中是一件好事。将整个列表数据存储到对象中将是多余的,因为用户是否回到应用程序,您的对象将覆盖我们应该在整个开发过程中避免的内存。祝你好运。