我试图在 onCreate
期间(也在 onStart
期间尝试过)通过 AsyncTask 从 Room
数据库加载数据。问题是,我通过 WeakReference
将上下文传递给 AsyncTask
,有时(四分之一)上下文在 onPostExecute 上变为 null
,即使任务几乎立即完成(它是一个小型数据库)。
我不知道在 onCreate
方法上通过 AsyncTask
加载数据的正确方法是什么,而不会冒上下文很快变为 null 的风险 - 我知道它有要通过 WeakReference 完成以避免内存泄漏,但我认为有时由于某种原因重新创建 Activity 如此之快以至于任务无法将结果发布到原始上下文并且数据没有显示在 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
接口(interface)是在调用 new MyTask(new ActivityListener() { ... });
谢谢
最佳答案
是的,我认为上下文变为 null 意味着重新创建了 Activity,但它似乎不太可能发生,因为我想象它是如此之快,以至于你不能比数据库操作更快地旋转手机
这个问题的间接答案很简单:根本不要使用 AsyncTask
,使用 ViewModel
和 LiveData
- 它们是来自 google 的架构以及您正在使用的 Room
简而言之,这两个组件将解决生命周期管理/上下文泄漏的问题,并将结果发送到正确的 Activity
实例
关于android - 通过 AsyncTask 在 onCreate() 期间加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51919171/