问题标签 [asynctaskloader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
857 浏览

android - 如何判断 AsyncTaskLoader 是否正在运行

我开始AsyncTaskLoader使用这个:

我想我可以用它来判断它是否正在运行:

isRunning总是返回true

0 投票
2 回答
997 浏览

android - CursorLoaders and AsyncTaskLoaders using same LoaderManager

I have a fragment that uses multiple CursorLoaders. All works fine. Now I need to add an AsyncTaskLoader as well, to the same fragment.

Question is, how can I use the same LoaderManager.LoaderCallbacks interface to manage both my CursorLoaders and AsyncTaskLoader?

My thought is that since CursorLoader is-a AsyncTaskLoader, then I should be able to adapt the LoaderCallBacks to both, but I may be miss the boat...

0 投票
1 回答
513 浏览

android - 从android上的Web服务获取请求的正确方法

我只是想知道哪种方法是使用 HTTP 请求从 Web 服务中获取数据的最佳方式。使用 AsyncTask 或 AsyncTaskLoader

我在 Activity 上使用 LoaderManager 使用 AsyncTaskLoader,但是在配置更改尤其是方向更改时遇到问题。它阻止加载程序调用 OnFinish()。

我还尝试过更灵活和独立的 AsyncTask,它在我之前仍在 2.2 上的项目上运行良好?由于在 3.0---4.0 中更推荐使用 AsyncTaskLoader,我会很感激您的意见。

0 投票
1 回答
479 浏览

android - AsyncTaskLoader 第三个任务消失

我正在尝试实现一个列表/详细信息工作流程,其中点击列表项会导致详细信息部分加载与新选择的行相关的数据。我正在尝试使用 anAsyncTaskLoader来完成此操作。我遇到了一个问题,如果我连续足够快地点击三个列表项,实际上只会发生两个负载,而第三个会丢失。

我编写了一个示例活动来演示这种行为。当点击按钮三次时,该loadInBackground()方法只会被调用两次。我在某个地方错过了一个电话吗?

0 投票
1 回答
744 浏览

android - AsyncTaskLoader with Dialogs,可行吗?

我开始了一个新应用程序,我想使用最新的 android 模式和指南,其中之一是使用 Loaders (AsyncTaskLoader) 而不是 AsyncTasks,我正在尝试查看 Loaders 是否应该真正取代你所有的 AsyncTasks “任务“ IE

假设您要基于 REST 调用构建应用程序,其中一个调用负责登录用户。因此,当您单击提交(在片段按钮上)时,会出现一个对话框,直到响应返回,如果我是正确的,除非您使用处理程序,否则 AsyncTaskLoader onLoadFinished 不会让您关闭对话框,并且很好地使用它,使解决方案看起来有点老套,因为你需要显示错误对话框,比如用户名或密码错误时,你可能会收到一堆对处理程序的调用。

我使用 AsyncTask 快速完成了此操作,一切正常,现在我将所有代码移至 AsyncTaskLoader答案。

我很感激你花时间。

0 投票
4 回答
6712 浏览

android - AsyncTaskLoader onLoadFinished 有一个挂起的任务和配置更改

我正在尝试使用AsyncTaskLoader在后台加载数据来填充详细视图以响应选择的列表项。我已经让它大部分工作了,但我仍然有一个问题。如果我在列表中选择第二个项目,然后在第一个选定项目的加载完成之前旋转设备,那么onLoadFinished()调用将报告正在停止的活动而不是新活动。当只选择一个项目然后旋转时,这很好用。

这是我正在使用的代码。活动:

列表片段:

结果片段:

我已经能够使用普通AsyncTask的 s 来完成这项工作,但我正在尝试了解更多关于Loaders 的信息,因为它们会自动处理配置更改。


编辑:我想我可能已经通过查看LoaderManager的来源找到了问题。当initLoader在配置更改后调用时,LoaderInfo对象的mCallbacks字段更新为新活动作为 的实现LoaderCallbacks,正如我所期望的那样。

但是,当有一个挂起的加载器时,主LoaderInfo对象也有mPendingLoader一个引用 a 的字段LoaderCallbacks,并且这个对象永远不会随着mCallbacks字段中的新活动而更新。我希望看到代码看起来像这样:

似乎正因为如此,挂起的加载程序调用onLoadFinished了旧的活动实例。如果我在此方法中设置断点并使用调试器进行我觉得缺少的调用,那么一切都会按我的预期工作。

新问题是:我是否发现了错误,或者这是预期的行为?

0 投票
5 回答
10357 浏览

android - 自定义 CursorLoader 和支持 ListView 的 CursorAdapter 之间的数据不同步

背景:

我有一个CursorLoader直接使用 SQLite 数据库而不是使用ContentProvider. 此加载程序与ListFragmentCursorAdapter. 到现在为止还挺好。

为简化起见,我们假设 UI 上有一个删除按钮。当用户单击它时,我从数据库中删除一行,并调用onContentChanged()我的加载器。此外,在onLoadFinished()回调时,我调用notifyDatasetChanged()我的适配器以刷新 UI。

问题:

当删除命令快速连续发生时,意味着快速连续onContentChanged()调用,bindView()最终将使用 stale data。这意味着一行已被删除,但 ListView 仍在尝试显示该行。这会导致光标异常。

我究竟做错了什么?

代码:

这是一个自定义 CursorLoader(基于Diane Hackborn 女士的建议)

我班级的一个片段ListFragment,显示了LoaderManager回调;以及refresh()每当用户添加/删除记录时我调用的方法。

MyCursorAdapter只是一个普通的,newView()被覆盖以返回新膨胀的行布局 XML 并bindView()使用Cursor将列绑定到View行布局中的 s。


编辑 1

在深入研究了这一点之后,我认为这里的根本问题是CursorAdapter处理底层Cursor. 我试图了解它是如何工作的。

采取以下场景以更好地理解。

  1. 假设CursorLoader已经完成加载并且它返回Cursor现在有 5 行的 a。
  2. 开始显示这些Adapter行。它移动Cursor到下一个位置并调用getView()
  3. 此时,即使在呈现列表视图的过程中,也会从数据库中删除一行(例如,_id = 2)。
  4. 这就是问题所在-CursorAdapter已将 移动Cursor到与已删除行相对应的位置。该bindView()方法仍然尝试使用 this 访问该行的列Cursor,这是无效的并且我们得到异常。

问题:

  • 这种理解正确吗?我对上面的第 4 点特别感兴趣,我假设当一行被删除时,Cursor除非我要求,否则它不会被刷新。
  • 假设这是正确的,我如何要求我CursorAdapter丢弃/中止它ListView 正在进行的渲染,并要求它使用新的Cursor(通过Loader#onContentChanged()and返回Adapter#notifyDatasetChanged())来代替?

PS向版主提出的问题:是否应该将此编辑移至单独的问题?


编辑 2

根据各种答案的建议,我对 s 如何工作的理解似乎存在根本性错误Loader。事实证明:

  1. Fragmentor根本Adapter不应该直接操作。Loader
  2. 应该监视数据的Loader所有变化,并且只要数据变化就应该提供AdapterCursoronLoadFinished()

有了这种理解,我尝试了以下更改。- 没有任何操作Loader。refresh 方法现在什么都不做。

Loader另外,为了调试和内部发生的事情ContentObserver,我想出了这个:

这是我的片段FragmentLoaderCallback

现在,每当数据库发生变化(添加/删除行)时,应该调用的onChange()方法 - 对吗?ContentObserver我没有看到这种情况发生。我的ListView从未表现出任何变化。我看到任何变化的唯一一次是如果我明确地调用onContentChanged().Loader

这里出了什么问题?


编辑 3

好的,所以我重写了我Loader的直接从AsyncTaskLoader. 我仍然没有看到我的数据库更改被刷新,也没有看到我在数据库中插入/删除一行时被调用的onContentChanged()方法:-(Loader

只是为了澄清一些事情:

  1. 我使用了代码CursorLoader并只修改了一行返回Cursor. ContentProvider在这里,我用我的代码替换了对的调用DbManager(它反过来用于DatabaseHelper执行查询并返回Cursor)。

    Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();

  2. 我对数据库的插入/更新/删除是从其他地方发生的,而不是通过Loader. 在大多数情况下,数据库操作发生在后台Service,在少数情况下,从Activity. 我直接使用我的DbManager类来执行这些操作。

我仍然没有得到的是 -谁告诉我Loader一行已被添加/删除/修改?换句话说,在哪里被ForceLoadContentObserver#onChange()调用?在我的加载器中,我在以下位置注册了我的观察者Cursor

这意味着当它发生变化时有责任Cursor通知它。mObserver但是,然后 AFAIK,“光标”不是“实时”对象,它会在数据库中修改数据时更新它指向的数据。

这是我的 Loader 的最新版本:

0 投票
2 回答
4164 浏览

android - 无法取消 AsyncTaskLoader 中正在运行的 AsyncTask

当用户单击主页按钮时,我想取消正在运行的 AsyncTask(在 AsyncTaskLoader 中)。这是我到目前为止创建的内容:

所以在 onStopLoading() 中我调用了 cancelLoad(),我认为它应该取消当前任务,但是 AsyncTaskLoader 中的 AsyncTask 仍在运行(而 loadInBackground() 中的循环仍在进行中)。

问题可能出在“java.android.support.v4.content.AsyncTaskLoader.java”中的 cancelLoad() 方法中,其中 mTask.cancel(boolean) 在参数中使用“false”调用:

是否有机会取消在 AsyncTaskLoader 中运行的 AsyncTask?

0 投票
6 回答
25847 浏览

android - AsyncTask 和 Thread 之间的真正区别

我一直在阅读有关此问题的 Android 文档(AsyncTaskThread)和vogella 教程,但我仍有疑问。

例如,我想从 Android 应用程序向服务器发送消息。我希望这个过程能够响应。我应该使用什么?

我已经看到了他们创建一个新Thread的不阻塞 UI 的示例,但是这样我们就没有进程的进度,而且您必须在其中处理响应,Thread因为该run()方法不返回任何内容。

AsyncTask似乎比 更好的选择Thread,但我不知道使用 aAsyncTask而不是 a的后果是什么Thread

0 投票
1 回答
2030 浏览

android - AsyncTaskLoader 如何缓存数据?

我有一个活动,它实现了所有这些代码所在的片段。这最好通过一个示例来解释,因为代码是机密的。这个例子反映了正在尝试做的事情以及我通过测试观察到的事情

例如)我有一个 rss 阅读器片段,它从两个具有加载器 ID(加载器 1、加载器 2)的唯一加载器中获取两个唯一对象(A、B)

在创建时,我在加载器 1 上调用“initloader”来获取对象 A。滚动浏览可用文章后,它会到达从对象 A 返回的 partialArcticlePreviewList 的底部,并使用“加载器 2 上的重新启动加载器”获取更多文章,该加载器获取对象 B 并允许用户阅读它们并继续为所有文章执行此操作。

这工作正常,直到用户旋转设备从而调用 onCreate。现在当在 Loader 1 上调用 initloader 时,它在连接到 loader 1 后立即跳转到 onLoadFinished 并返回一个 Loader 1。虽然 articleIds 正确返回,但返回的 partialArcticlePreviewList 是从 Loader 2 获取对象 B 的那个。

加载器管理器是否只在缓存中保留一个对象实例并在多个加载器之间共享它?从广泛的测试(5 多个小时试图找到问题并查看 Eclipse 调试器中的加载程序 ID/缓存/地址)看来,它用加载程序 2 的部分内容预览列表中收到的数据覆盖了加载程序 1 的部分内容预览列表。虽然这种情况对于单个加载器来说是理想的,但我原以为每个加载器的缓存都是独立的。显然,加载程序的优点之一是它们易于使用,并且通过屏幕旋转和数据缓存实现持久性,但它似乎并没有像暗示的那样工作。我们'

编辑:忘了补充,我们使用的是兼容性库 v4。此外,查看加载程序的 android 源代码似乎并没有说明加载程序为何返回错误数据的“mId”。