【问题标题】:Update a recyclerView in another activity from async thread of other activity从其他活动的异步线程更新另一个活动中的 recyclerView
【发布时间】:2016-05-24 14:43:40
【问题描述】:

我有两个活动 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
}

【问题讨论】:

  • 你可以用监听器写一些单音(不好的模式)或者写自定义服务
  • 如果您想在它们之间共享数据恕我直言,您需要将数据/网络逻辑从任何活动中移开。我会使用 MVP 方法,或者如果您不希望这样做,您可以使用 SQLite 数据库并与 CursorAdapters/ContentObservers 一起创建内容提供程序。当然还有其他方法,但这是我的处理方式。
  • 谢谢,我使用事件总线来管理交互活动通信

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


【解决方案1】:
  1. 可以尝试制作一个可以接收广播的广播接收器 由您的异步线程触发的消息。

或者

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

或者

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

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

在第二种情况下,当用户切换得更早时,您可以在恢复下一个活动时检查内容。如果尚未收到内容,那么您最终可以实现上述 3 种方法观察者中的任何一种,当收到内容时,您的观察者将收到通知。

【讨论】:

  • 谢谢,我使用事件总线来管理交互活动通信
  • 你应该接受并投票,这对其他人也有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多