我的 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。
第二个后台任务从另一个数据源加载一些其他数据。
问题:一旦加载了这些数据,在完成过程之前,我需要从AsyncTask
的onViewCreated
访问ArrayAdapter
中加载的数据。
考虑到:
1) 我不应该从非 UI 线程访问 ArrayAdapter
并且
2) 我不能确定 onViewCreated
的 AsyncTask
是否已经完成(我最近被告知 AsyncTasks 实际上是一个接一个地运行)
如何修复我的设计以使其正常工作?
请注意,onViewCreated
加载的数据比onResume
加载的数据要多得多,所以最好不要在每个简历上重新加载它们
【问题讨论】:
为什么不能查看AsyncTask
的状态? myasync.getStatus() == AsyncTask.Status.FINISHED
@JuanCortes:谢谢。我认为这将解决问题(2)。但是问题(1)呢?
onPostExecute
和 onPreExecute
据我所知在 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 对象?