首页 > 解决方案 > 在 onCreate() 期间通过 AsyncTask 加载数据

问题描述

我正在尝试通过 AsyncTask 从数据库加载数据onCreate(期间也尝试过)。问题是,我将上下文传递给via a ,有时(四分之一)上下文在 上变为 null ,即使任务几乎立即完成(它是一个小型数据库)。onStartRoomAsyncTaskWeakReferenceonPostExecute

我不知道哪种方法是通过方法加载数据的正确方法,AsyncTaskonCreate不会冒着上下文很快变为空的风险 - 我知道必须通过 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() { ... });

谢谢

标签: androidandroid-asynctaskandroid-roomweak-referencesoncreate

解决方案


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

对这个问题的间接回答只是:根本不使用AsyncTask,使用ViewModelLiveData- 它们是谷歌架构的一部分,也是Room你正在使用的

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

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


推荐阅读