从其他活动的异步线程更新另一个活动中的recyclerView

时间:2016-05-24 14:43:41

标签: java android android-activity android-recyclerview android-async-http

我有两个活动A和B.

在活动A中我有一个AsyncHttpClient从网站获取一些数据。收到数据后,我刷新活动A中的RecyclerView。但是当有人切换到活动B时正在获取数据,我希望在完成数据提取时刷新活动B的RecyclerView。

目前,我可以在同一活动A中更新,但不能在B中更新。

这就是我所做的 -

public void loadFromWeb(){
            RequestParams params = new RequestParams();
            AsyncHttpClient client = new AsyncHttpClient();
            params.put("id", id);

            client.post("http://example.com/process.php", params, new JsonHttpResponseHandler() {
                @Override
                public void onStart() {

                }

                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    try {
                        //process the response

                        adapterInActivityA.notifyDataSetChanged();
                        //This works for Activity A

                        //How to implement the function updateInActivityB()?  
                        updateInActivityB();

                    } catch (Exception e) {
                        //catch exception
                    }
                }

                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    // Process failure
                }

            });
}

问题是如何实现函数updateInActivityB()

解决方案(由Alok建议)

以下是我为其他想要做同样事情的人做的详细信息 -

这使用greenrobot's EventBus library

通过将库添加到应用程序的build.gradle文件

来编译库

编译库

compile 'de.greenrobot:eventbus:2.4.0'

创建您的事件类,这将存储您正在通信的数据。

//In FirstActivity

public class myEvent {
    private final String data;

    //Constructor
    public myEvent(String data){
        this.data = data;
    }

    public String getData(){
        return data;
    }
}

每当您想要发送更新时,数据都已下载(即在updateInSecondActivity()函数中)

发布更新 -

//In FirstActivity

public void updateInSecondActivity(){
    EventBus.getDefault().post(new myEvent("Updated Data");
}

现在,在SecondActivity中,您必须倾听此事件。首先在SecondActivity中注册以订阅事件 -

注册活动

//In SecondActivity

EventBus.getDefault().register(this);

您可以在onCreate(),onStart(),onResume()中注册。也不要忘记在onPause(),onDestroy(),onStop()中取消注册 -

取消注册事件监听器

//In SecondActivity

EventBus.getDefault().unregister(this);

注册和取消注册到位后,您必须收听FirstActivity是否已发布更新。你可以通过创建一个onEvent()函数来监听myEvent类的发布 -

收听活动

//In SecondActivity

public void onEvent(myEvent mE){
    String updatedData = me.getData();
    // Process/update using the updateData
}

1 个答案:

答案 0 :(得分:0)

  1. 您可以尝试制作可以接收广播的广播接收器 异步线程触发的消息。
  2. 或者

    2.您可以使用事件总线进行无限制的沟通。

    或者

    3.您可以为收到的内容注册观察员。

    逻辑非常简单 如果在用户切换到下一个活动之前获取的数据比一切正常,您尝试获取数据。

    在第二种情况下,当用户提前切换时,您可以在恢复下一个活动时检查内容。如果收到的内容尚未收到,则最终会在收到您的观察员的内容时通知上述3方法观察员中的任何一个。