MVP和RxJava - 在Android上处理方向更改

Mob*_*Dev 5 android screen-orientation rx-java rx-android

我使用类似于google-samples repo的MVP和RxJava .

我想问一下如何正确处理屏幕方向的变化.

R. *_*ski 8

还有另一种策略可以保存演示者状态和Observable状态:保留Fragment.这样就省略了将数据保存到的标准Android方式Bundle(只能保存简单变量,而不能保存网络请求的状态.)

Activity:

public class MainActivity extends AppCompatActivity implements MainActivityView {
    private static final String TAG_RETAIN_FRAGMENT = "retain_fragment";

    MainActivityPresenter mPresenter;

    private MainActivityRetainFragment mRetainFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        initRetainFragment();
        initPresenter();
    }

    private void initRetainFragment() {
        FragmentManager fm = getSupportFragmentManager();
        mRetainFragment = (MainActivityRetainFragment) fm.findFragmentByTag(TAG_RETAIN_FRAGMENT);
        if (mRetainFragment == null) {
            mRetainFragment = new MainActivityRetainFragment();
            fm.beginTransaction().add(mRetainFragment, TAG_RETAIN_FRAGMENT).commit();
        }
    }

    private void initPresenter() {
        mPresenter = mRetainFragment.getPresenter();
        mRetainFragment.retainPresenter(null);
        if (mPresenter == null) {
            mPresenter = new MainActivityPresenter();
        }
        mPresenter.attachView(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (!isFinishing()) {
            mRetainFragment.retainPresenter(mPresenter);
            return;
        }
        mPresenter.detachView();
        mPresenter = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

保留Fragment:

public class MainActivityRetainFragment extends Fragment {
    private MainActivityPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void retainPresenter(MainActivityPresenter presenter) {
        this.presenter = presenter;
    }

    public MainActivityPresenter getPresenter() {
        return presenter;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意处理活动生命周期事件的方式.当Activity创建,留住Fragment被添加到堆栈中,并在生命周期事件,它是从堆栈中恢复.retain Fragment没有任何视图,它只是配置更改期间演示者的持有者.请注意主要调用,它允许从backstack恢复完全相同的片段(及其内容):

setRetainInstance(true)
Run Code Online (Sandbox Code Playgroud)

如果您担心内存泄漏:每次恢复演示者时,都会恢复演示者的视图:

mPresenter.attachView(this);
Run Code Online (Sandbox Code Playgroud)

所以先前的Activity参考被新的参考替换.

更多关于这种处理的配置变化在这里在这里