Android 通过AsyncTask在onCreate()期间加载数据

Android 通过AsyncTask在onCreate()期间加载数据,android,android-asynctask,android-room,weak-references,oncreate,Android,Android Asynctask,Android Room,Weak References,Oncreate,我正在尝试通过AsyncTask从房间数据库在onCreate期间加载数据(也在onStart期间尝试)。问题是,我通过WeakReference将上下文传递给异步任务,有时(四分之一)上下文在onPostExecute上变为空,即使任务几乎立即完成(这是一个小数据库) 我不知道通过onCreate方法上的AsyncTask加载数据的正确方法是什么,而不会让上下文很快变为null-我知道必须通过WeakReference来完成,以避免内存泄漏,但我认为,由于某些原因,活动有时会很快被重新创建,以

我正在尝试通过AsyncTask从
房间
数据库在
onCreate
期间加载数据(也在
onStart
期间尝试)。问题是,我通过
WeakReference
将上下文传递给
异步任务,有时(四分之一)上下文在
onPostExecute
上变为空,即使任务几乎立即完成(这是一个小数据库)

我不知道通过
onCreate
方法上的
AsyncTask
加载数据的正确方法是什么,而不会让上下文很快变为null-我知道必须通过WeakReference来完成,以避免内存泄漏,但我认为,由于某些原因,活动有时会很快被重新创建,以至于任务无法将结果发布到原始上下文,并且数据不会显示在
活动中

考虑到任务几乎立即完成,但
Room
库要求通过另一个线程来完成任务(an还可以提高性能和响应能力),您知道什么是正确的处理方法吗

因此,为了清楚起见,我尝试以这种方式访问上下文:

public MyTask(ActivityListener listener) {
    mWeakContext = new WeakReference(listener);
}

protected void onPostExecute(Boolean result) {
    AcitivtyListener aListener = mWeakContext.get();
    if (aListener != null) aListener.refresh(data);
}
ActivityListener
接口是在调用
newmytask(newactivitylistener(){…})时匿名实现的


谢谢

是的,我认为上下文变为null意味着活动被重新创建,但这似乎不太可能发生,因为我想象它的速度如此之快,以至于你无法比数据库操作更快地旋转手机

对这个问题的间接回答是:根本不要使用
AsyncTask
,使用
ViewModel
LiveData
——它们是google架构的一部分,也是您正在使用的
Room

简而言之,这两个组件将解决生命周期管理/上下文泄漏的问题,并将结果发送到更正
活动
实例


请参阅有关LiveData和ViewModel的文档:

谢谢您的回答。我会检查这是否解决了问题(这不是微不足道的),并考虑明天验证答案!谢谢,这不是小事,但如果你投入时间,我想你会发现这种方法更好,如果你仔细研究一下,比如说RxJava,你会完全放弃异步任务,喜欢听你的进展