PrototypeZ / SaveState

:icecream: Generate 'onSaveInstanceState' and 'onRestoreInstanceState' methods for your application automatically
1.01k stars 79 forks source link

提供一种 Optional 在 onCreate 中恢复数据 #9

Open jackieliu-52 opened 5 years ago

jackieliu-52 commented 5 years ago

onRestoreInstanceState 的调用是在 onStart 之后的,但是很多场景下,我们只会在 onCreate 中去发起网络请求,而网络请求需要这些保存的数据,所以提个建议希望可以在 onCreate 中恢复状态

PrototypeZ commented 5 years ago

@lymxit 您好,您的实际使用场景是在 Activity 中吗?如果是在 Activity 中的话,恢复时机就是在 onCreate 的。你这边方便贴一下代码吗?

jackieliu-52 commented 5 years ago

@PrototypeZ 我这边是准备在项目中接入,不过是看到你这边文档写着: No boilerplate code like onSaveInstanceState or onRestoreInstanceState any more. 我以为是在 onRestoreInstanceState 再去恢复的。 建议在文档说明下,如果是 Activity 中,是在 onCreate 时期恢复的。 最后有个建议是,可以提供两种恢复机制,某些变量是要求在 onCreate 中恢复的,某些变量要求在 onRestoreInstanceState 中恢复(因为继承关系可能不会去调用 super.onCreate)。

PrototypeZ commented 5 years ago

@lymxit 感谢您的建议,稍后我会加入到文档中。 关于是否要提供选在选择在 onRestoreInstanceState 还是在 onCreate 恢复这个问题,我思考过,我认为 onCreate 时机更早,既然可以在更早的时机恢复就应该更早恢复,所以没有提供这个选项,统一在 onCreate 恢复。本框架基于编译时字节码修改,所以跟您这边有没有调用 super.onCreate() 没有关系, 除此以外您这边还有其他例子可以说明需要加这个功能吗?

jackieliu-52 commented 5 years ago

BaseActivity <- XActivity <- YActivity 然后 YActivity 在 onCreate 的时候可能没有去调用 super.OnCreate(某种情况需要),但需要使用 XActivity的一些变量,那么在这种情况下,XActivity 的变量就不会被恢复

PrototypeZ commented 5 years ago

您可以在 XActivity 中的对应变量上标记 @AutoRestore 标记,这样您可以在 YActivity 中安全的使用这个变量,和您是否调用了 super.onCreate() 没有关系。

jackieliu-52 commented 5 years ago

`class XActivity extends Activity { @AutoRestore protected int someValue;

public void onCreate(Bundle save){
    super.onCreate(save);
    // do some stuff
}

}

class YActivity extends XActivity {

public void onCreate(Bundle save){
    // don't call super.onCreate

}

public void doSomeStuff(){
   Log.i(TAG,"%d",someValue);  // after process death,It isn't reliable
}

}`

PrototypeZ commented 5 years ago

您的建议已收到,我会更新一版,支持您这种情况,谢谢!

shingohu commented 5 years ago

@PrototypeZ 看了下Fragment是在onActivityCreated后恢复的,一般我们会在onViewCreated 之后开始UI操作,导致数据没有及时恢复,为何Fragment不在onCreate中进行恢复呢

PrototypeZ commented 5 years ago

@shingohu 你好,目前Fragment状态恢复是在 onActivityCreated 中完成的,考虑到 onViewCreated 是在 sdk 17 中才加入的新方法,目前项目 minSdk 是15 所以当时偷懒没考虑,您这个建议很好,我会把这个功能加入进去,谢谢。您的问题目前的 WorkAround 可以是把操作数据的逻辑 post 一下,就可以暂时绕过这个问题。

QiLiKing commented 5 years ago

不调用super.onCreate()不会崩溃吗?是延后调用吧:-D

wuyang2000 commented 5 years ago

技术高超,谦虚,您才是榜样,真正的大神。加油