- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在我的应用程序中使用了一个加载器,根据我使用这个加载器对联系人执行的查询得到的结果,我执行了一些计算并将它们存储回 Sqlite 数据库中。我希望这个操作是异步的,但是我对使用异步任务感到困惑,因为我有很多不同的数据类型要返回,或者我应该使用简单的处理程序还是 AsyncTaskLoader,我希望它简单,因为我是新手装载机。我试图四处搜索 AsyncTaskLoader 的示例,但它似乎是火箭科学,在我的场景中,这三者中的任何一个的基本且简单的功能示例会很有帮助。
最佳答案
如果您想使用 AsyncTaskLoader,here's给你一个很好的样本。
编辑:我决定制作一个更简单的解决方案(基于 this repo):
public abstract class AsyncTaskLoaderEx<T> extends AsyncTaskLoader<T> {
private static final AtomicInteger sCurrentUniqueId = new AtomicInteger(0);
private T mData;
public boolean hasResult = false;
public static int getNewUniqueLoaderId() {
return sCurrentUniqueId.getAndIncrement();
}
public AsyncTaskLoaderEx(final Context context) {
super(context);
onContentChanged();
}
@Override
protected void onStartLoading() {
if (takeContentChanged())
forceLoad();
//this part should be removed from support library 27.1.0 :
//else if (hasResult)
// deliverResult(mData);
}
@Override
public void deliverResult(final T data) {
mData = data;
hasResult = true;
super.deliverResult(data);
}
@Override
protected void onReset() {
super.onReset();
onStopLoading();
if (hasResult) {
onReleaseResources(mData);
mData = null;
hasResult = false;
}
}
protected void onReleaseResources(T data) {
//nothing to do.
}
public T getResult() {
return mData;
}
}
用法:
在你的 Activity 中:
getSupportLoaderManager().initLoader(TASK_ID, TASK_BUNDLE, new LoaderManager.LoaderCallbacks<Bitmap>() {
@Override
public Loader<Bitmap> onCreateLoader(final int id, final Bundle args) {
return new ImageLoadingTask(MainActivity.this);
}
@Override
public void onLoadFinished(final Loader<Bitmap> loader, final Bitmap result) {
if (result == null)
return;
//TODO use result
}
@Override
public void onLoaderReset(final Loader<Bitmap> loader) {
}
});
内部静态类,或普通类:
private static class ImageLoadingTask extends AsyncTaskLoaderEx<Bitmap> {
public ImageLoadingTask (Context context) {
super(context);
}
@Override
public Bitmap loadInBackground() {
//TODO load and return bitmap
}
}
更新:从支持库 27.1.0 开始,事情发生了一些变化(链接 here):
In version 27.1.0, onStartLoading() is called every time the Activity is started. Since you call deliverResult() in onStartLoading(), you trigger onLoadFinished(). This is Working as Intended.
You should remove your call to deliverResult() from onStartLoading() as it is not needed (Loaders already deliver results computed in loadInBackground() without any additional work needed on your part).
我已针对此更改更新了上面的代码。
编辑:更新了,kotlin版本可以找到here .
关于android - AsyncTaskLoader 基本示例。 (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279216/
我正在尝试创建一个将搜索结果加载到 fragment 列表中的搜索函数。问题是搜索向 API 发出了两个请求:一个针对类型 A,一个针对类型 B。 我的实现方式是创建一个包含两个 fragment 的
我在加载器方面遇到了一些问题,但我不明白我做错了什么。这是初始化和启动 Loader 的 fragment import android.os.Bundle; import android.suppo
这似乎是一个愚蠢的问题,但我无法理解 AsynctaskLoader 的状态。 我已经多次阅读文档以及网络上的其他教程。但是,我仍然无法理解Asynctask 何时处于Reset 状态 看看从官方文档
有几个关于如何实现自定义 AsyncTaskLoader 的教程,但我发现没有一个讨论如何处理数据缓存 - 在所有这些教程中,数据都只是加载和传送。 您能否给我一些提示,说明如何实现自定义 Async
我不明白AsyncTaskLoader中的所有函数是做什么的,比如onCancelLoad()和onForceLoad()。所有函数及其调用顺序均未正确记录。 假设我想在后台下载一个文件并在需要时取消
在我最近的一个 SO 问题中,有人建议我使用 Loader 作为我的解决方案。所以在这里我试图了解如何实现一个简单的 AsyncTaskLoader 这是我想出的: public class Scra
我有一个 Activity 实现了所有这些代码所在的 fragment 。由于代码是 secret 的,因此最好通过示例对此进行解释。这个例子反射(reflect)了正在尝试做的事情以及我通过测试观察
我需要做出设计决定。 从我在 android 开发者网站上读到的内容来看,我想我想实现一个服务,它启动一个 AsyncTaskLoader 以在后台从操作系统进程加载数据。 在 android 开发人
我想使用 Compatibility Package 在我的项目中实现 AsyncTaskLoader,所以我按照 Android Docs 中的 Loader 手册进行操作。 问题是加载器什么都不做
好吧,我很难理解我的应用程序出了什么问题。所以我有带有这样的选项卡的 ViewPager: 适配器.java public class CustomPagerAdapter extends Fragm
我正在尝试编译示例: http://developer.android.com/reference/android/content/AsyncTaskLoader.html 在onCreateLoad
在 onCreate() 中初始化 Loader 并在按下按钮时重新启动 Loader 的简单代码。关于 android 文档 getLoaderManager().restartLoader() 应
我使用的是 v13 支持库,支持取消所需的所有函数(例如 isLoadInBackgroundCanceled 和 cancelLoadInBackground 都完全缺失。 最佳答案 已回答 her
我有一个简单的 fragment ,试图在其中实现 AsyncTaskLoader。但是我遇到了一个编译时错误: 错误:类型不兼容必需的:加载器成立:装载无人机 错误在 onCreateLoader
我正在使用这个启动一个 AsyncTaskLoader: getLoaderManager().initLoader(0, null, this); 我想我可以用它来判断它是否正在运行: Boolea
谁能告诉我 AsyncTaskLoader 和 AsyncQueryHandler 之间的区别? 我想在我的应用程序中使用 AsynTaskLoader。我的应用程序中现有的是 AsyncQueryH
我想为我的自定义数据源实现 AsyncTaskLoader: public class DataSource { public interface DataSourceObserver {
我的 AsyncTaskLoader 有几个问题,不确定它们是否相关,因为它们都是在尝试重新启动加载程序时发生的。在我的应用程序中,我有 3 个自定义 CursorAdapter 实例,由 1 个单例
他们到处告诉我们应该使用 ASyncTaskLoaders,因为他们非常擅长不阻塞 UI 线程。现在可以使用 Volley。 我想我们不能同时使用它们,因为 Volley 自己做背景。你怎么看?哪个更
我试图了解 AsyncTaskLoaders 的一些细节.这对其他人来说可能是显而易见的,但我找不到一个明确的示例或定义来演示和解释当您覆盖 deliverResult() 时会发生什么情况。方法。实
我是一名优秀的程序员,十分优秀!