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

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

我试图在 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,使用 ViewModelLiveData - 它们是来自 google 的架构以及您正在使用的 Room

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

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

关于android - 通过 AsyncTask 在 onCreate() 期间加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51919171/

相关文章:

java - 房间 : performance of insert(Object) vs insert(List<Object>)

android - 调整九片PNG的中心

android - 从异步任务执行时 "error code 5: databse is locked"

android - 多个异步任务挂起应用程序

android - 如何在android中获取Room数据库的行数?

android - 如何在 Room 中插入具有一对多关系的实体

android - fragment 中的 LocationListener

java - 如何将 Open GL ES 2.0 应用程序转换为动态壁纸?

javascript - 防止后退按钮退出 Cordova 应用程序

android - 制作 AsyncTask 的模式 "procedural"