我的 onResume 依赖于`onViewCreated`。我该如何重新设计它?

Posted

技术标签:

【中文标题】我的 onResume 依赖于`onViewCreated`。我该如何重新设计它?【英文标题】:My onResume depends on `onViewCreated`. How can I redesign it? 【发布时间】:2016-08-16 23:36:03 【问题描述】:

我有一个片段,onViewCreated 启动了一个 AsyncTask,它在后台加载一些数据,并在 onPostExecute 中将数据加载到 ArrayAdapter 以显示在 UI 中的列表中。 现在onResume 我需要加载一些需要在后台线程中加载的其他数据。所以我可以为此使用启动 AsyncTask。 第二个后台任务从另一个数据源加载一些其他数据。

问题:一旦加载了这些数据,在完成过程之前,我需要从AsyncTaskonViewCreated 访问ArrayAdapter 中加载的数据。 考虑到: 1) 我不应该从非 UI 线程访问 ArrayAdapter 并且 2) 我不能确定 onViewCreatedAsyncTask 是否已经完成(我最近被告知 AsyncTasks 实际上是一个接一个地运行) 如何修复我的设计以使其正常工作? 请注意,onViewCreated 加载的数据比onResume 加载的数据要多得多,所以最好不要在每个简历上重新加载它们

【问题讨论】:

为什么不能查看AsyncTask的状态? myasync.getStatus() == AsyncTask.Status.FINISHED @JuanCortes:谢谢。我认为这将解决问题(2)。但是问题(1)呢? onPostExecuteonPreExecute 据我所知在 UI 线程上运行 developer.android.com/intl/es/reference/android/os/… @JuanCortes:是的,但我需要从doInBackground访问从任务 1 加载的数据 如果您想在 onPostExecute 之前访问它,请使用 runOnUiThread 并将您的代码包装在可运行文件中,或者使用同样在 UI 线程上运行的 onProgressUpdate 【参考方案1】:

您可以通过调用.getStatus() 来检查AsyncTask 的状态,看看它是否已完成(AsyncTask.Status.FINISHED)。至于从 asyncTask 内部访问适配器,您需要使用 onProgressUpdate,它会在每次更新任务时触发,或者如果您不更新进度,可以将其包裹在 Runnable 中,就像这样:

//Inside doInBackground
runOnUiThread(new Runnable() 
    public void run() 
        //Your logic
    
);

不同之处在于,如果您的代码类似于下载图像或文件,它将在循环中运行,每次读取 n 个字节。您可以调用publishProgress(Progress...) 触发onProgressUpdate 方法并向用户显示反馈,如下载50%。

【讨论】:

但是如果 AsyncTasks 一个接一个地运行,getStatus 怎么能工作,除非一个总是排在另一个之后

以上是关于我的 onResume 依赖于`onViewCreated`。我该如何重新设计它?的主要内容,如果未能解决你的问题,请参考以下文章

项目遇到的问题

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?(不依赖Lifecycle)

关于FragmentManager动态管理Fragment时Fragment生命周期的探究

在 onViewCreated 中引用了 null 的 Activity 对象?

Android导航组件,如何知道结果是不是设置onViewCreated

在 PopBackStack 之后片段弹出调用 OnViewCreated