通过AsyncTask

时间:2018-08-19 15:28:18

标签: android android-asynctask android-room weak-references oncreate

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

我不知道哪种正确的方法可以通过AsyncTask上的onCreate加载数据,而又不会冒上下文如此快速地变为空的风险-我知道必须通过WeakReference完成为了避免内存泄漏,但我认为有时会由于某种原因而重新创建活动,以至于任务无法将结果发布到原始上下文中,并且数据也不会显示在Activity中。

考虑到任务几乎立即完成的事实,有什么想法可以解决该问题,但是Room库要求通过另一个线程来完成此任务(这也提高了性能和响应能力)?

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

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

protected void onPostExecute(Boolean result) {
    AcitivtyListener aListener = mWeakContext.get();
    if (aListener != null) aListener.refresh(data);
}

ActivityListener接口是在调用new MyTask(new ActivityListener() { ... });时匿名实现的

谢谢

1 个答案:

答案 0 :(得分:0)

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

此问题的间接答案将是:根本不使用AsyncTask,使用ViewModelLiveData-它们是google和{{ 1}}您正在使用

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

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