Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jackieliu-52 opened this issue Sep 18, 2018 · 11 comments
Open

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

jackieliu-52 opened this issue Sep 18, 2018 · 11 comments

Comments

@jackieliu-52
Copy link

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

@PrototypeZ
Copy link
Owner

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

@jackieliu-52
Copy link
Author

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

@PrototypeZ
Copy link
Owner

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

@jackieliu-52
Copy link
Author

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

@PrototypeZ
Copy link
Owner

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

@jackieliu-52
Copy link
Author

`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
Copy link
Owner

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

@shingohu
Copy link

shingohu commented Nov 17, 2018

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

@PrototypeZ
Copy link
Owner

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

@QiLiKing
Copy link

QiLiKing commented Jun 4, 2019

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

@wuyang2000
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants