Android-在没有onActivityResult()的情况下从活动传回信息的最佳实践是什么?

时间:2018-07-07 09:04:31

标签: android android-activity back-stack

我有一个比较笼统的问题。 假设我有一个 MainActivity 形式的 RecyclerView 。此RecyclerView的内容正在其他活动中的多个位置更新

例如,可以通过启动一个新的Activity并将其保存在那里来进行新输入。在这种情况下,我会直观地从startActivityForResult()开始该Activity并在onActivityResult()中接收更改。 MainActivity中的方法。

但是,可以说在应用程序内部更深,有可能删除所有条目。现在,我们如何通知MainActivity有关数据集中的更改?我考虑过设置某种标志,并在MainActivity中更新内容后将其清除。但是以某种方式使用全局变量并不能真正遵循正确封装的原理,对吗?

很抱歉这个模糊的问题,但是我发现很难以一种优雅的方式正确处理Android中的信息流,所以就在这里。

5 个答案:

答案 0 :(得分:0)

您可以使用Handler在活动中传递消息,然后必须更新 RecyclerView 。喜欢,

1)在活动中。

  public static Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {

         if(msg.what == 1223){
                //update RecyclerView 
         }

         return false;
        }
    });

2)通过消息,当您想更新RecyclerView时

 Message msg = new Message();
 msg.what = 1223;
 Activity1.mHandler.sendMessage(msg);

答案 1 :(得分:0)

您可以使用EventBus来处理它。
为您的活动定义一个班级

public static class MyEvent { 
    int event;
    /* define your fields */
}

并准备主要活动中的订户

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMyEvent(MyEvent myEvent) {
    switch(myEvent.event) {
        /* Do what you need */
    }
};

现在您需要进行更改的地方,像这样致电您的订户:

MyEvent myEvent = new MyEvent();
myEvent.event = 1;
EventBus.getDefault().post(myEvent);

您可以在here

中了解有关EventBus的更多信息

答案 2 :(得分:0)

如果您使用的是RxJava2,则RxAndroid。然后您可以尝试一下。

  • 创建公交车:

    public final class RxBus {
    
        private static final BehaviorSubject<Object> behaviorSubject = BehaviorSubject.create();
    
        public static BehaviorSubject<Object> getSubject() {
            return behaviorSubject;
        }
    }
    
  • 在WaitingActivity中要接收数据的位置(在这种情况下不要使用onActivityResult的地方)

    Disposable disposable = RxBus.getSubject().
                    subscribeWith(new DisposableObserver<Object>() {
                        @Override
                        public void onNext(Object o) {
                            if (o instanceof DataObject) {
                                //((DataObject) o).getValue();
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
    
                        }
                        @Override
                        public void onComplete() {
    
                        }
                    });
            });
    
  • 在您要发送数据的活动中

    RxBus.getSubject().onNext(dataObject);
    startActivity(new Intent(CurrentActivity.class, WaitingActivity.class));
    
  • 最后不要忘了处置一次性用品,以免WaitingActivity中的内存泄漏

    @Override
    protected void onDestroy() {
        super.onDestroy();
        disposable.dispose();
    }
    

答案 3 :(得分:0)

local broadcast怎么样?您可以在此document中找到广播的想法。您需要本地广播,如果只想在您的应用程序中传递数据,则是首选方法。

  

Android应用程序可以从Android系统和其他Android应用程序发送或接收广播消息,类似于发布-订阅设计模式。当感兴趣的事件发生时,将发送这些广播。例如,Android系统会在发生各种系统事件(例如系统启动或设备开始充电)时发送广播。应用程序还可以发送自定义广播,例如,以向其他应用程序通知他们可能感兴趣的内容(例如,已下载一些新数据)。

答案 4 :(得分:0)

在模型中,您的数据应与视图分开。如果其他活动发生变化,理想情况下必须从那里更新回收者视图。因此,无论哪个活动做什么,在加载时刷新数据或恢复回收视图的数据时,始终会得到正确的结果。