TonnyL / PaperPlane

📚 PaperPlane - An Android reading app, including articles from Zhihu Daily, Guokr Handpick and Douban Moment.
Apache License 2.0
1.14k stars 277 forks source link

关于后台被回收的问题 #3

Closed Loren-Moon closed 7 years ago

Loren-Moon commented 7 years ago
你好,我们app也采用了谷歌官方mvp的架构,发现应用在后台被回收后,打开应用界面空白,presenter为空,明明是已经走了MainActivity的onCreate等生命周期,没找到解决方案。
然后看到你的app,发现如果后台被回收打开应用程序就直接崩溃了,所以问问有没有解决方案或者好的思路= =,不太想使用onRestoreInstanceState之类的恢复数据,希望被回收后再打开应用是重新打开
TonnyL commented 7 years ago

嗯 其实我也发现了,之前有用户反映这个问题。 暂时不知道有什么比较好的办法,有一种思路就是将view的生命周期和presenter同步,好像有一个叫做rxlifecycler的裤子。不过我不会用rx这个系列(我还是个渣。。。)。

TonnyL commented 7 years ago

如果你找到了比较好的方法,麻烦也告诉我一下😃

Loren-Moon commented 7 years ago

@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { TaskManager.getInstance().closeAll(); // 清空activity栈 Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); super.onRestoreInstanceState(savedInstanceState); }

我app暂时是这样解决的了,MainActivity里面添加这个,被回收应用再打开会走这个方法。= =我也没啥好办法,这样起码不会崩溃。我看看你推荐的那个先。

tzizi5566 commented 7 years ago

mFragment = Fragment.newInstance();
new Presenter(mFragment );

之前我也都这样写,看了这个问题后试了下自己的程序果然也崩了。
之后用了下面这种写法就没问题了。

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().putFragment(outState, "mFragment", mFragment );
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       if (savedInstanceState != null) {
            mFragment = (Fragment) getSupportFragmentManager().getFragment(savedInstanceState, "mFragment");
        } else {
            initFragment();
        }
        new Presenter(mFragment );
    }
TonnyL commented 7 years ago

被回收之后重新取出来就行哦,怎么没想到这茬。cool @tzizi5566