gpt4 book ai didi

android - AsyncTaskLoader 基本示例。 (安卓)

转载 作者:IT老高 更新时间:2023-10-28 23:02:38 24 4
gpt4 key购买 nike

我在我的应用程序中使用了一个加载器,根据我使用这个加载器对联系人执行的查询得到的结果,我执行了一些计算并将它们存储回 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com