当前位置: 首页 > 知识库问答 >
问题:

AsyncTaskLoader基本示例。(Android)

白吕恭
2023-03-14

我在我的应用程序中使用了一个加载器,根据使用该加载器对联系人执行查询的结果,我执行了一些计算并将它们存储回Sqlite DB中。我希望这个操作是异步的,但是我混淆了使用异步任务,因为我有很多不同的数据类型要返回,还是应该使用简单的处理程序或AsyncTaskLoader,我希望它简单,因为我是加载器的新手。我试图四处搜索AsyncTaskLoader的示例,但在我的场景上下文中,这三个示例中的任何一个基本而简单的功能示例似乎都很有帮助。

共有1个答案

洪和平
2023-03-14

如果您希望使用AsyncTaskLoader,这里有一个很好的示例。

编辑:我决定做一个更简单的解决方案(基于此回购):

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;
    }
}

用法:

        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
    }
}

编辑:更新,kotlin版本可以在这里找到。

 类似资料:
  • 本文向大家介绍独立React.js基本示例,包括了独立React.js基本示例的使用技巧和注意事项,需要的朋友参考一下 首先让我们开始编写一个简单的HTML代码,然后看看如何使用React 基本的React示例 -创建一个简单的div,如下所示- 添加一些样式元素 就像网络应用中的普通html数据一样。现在,我们可能有多个相同的玩家,然后我们必须复制相同的div,如下所示 这些div的结构相同,但

  • 问题内容: 我正在为教育目的制作一个演示ASP.NET MVC应用程序。 我有一个图像/链接将帖子标记为令人反感。我想通过AJAX从服务器请求标记攻击,并检查以确保用户具有此功能。 如果用户这样做,那么我想在数据库中将该帖子标记为令人反感,并返回该标记已通过。如果用户最终无权标记项目,那么我想向客户端返回否定消息,以便我可以弹出一个漂亮的jQuery框,指出它没有通过。 我正在尝试做所有这些而没有

  • 我试图实现一个基本的Hibernate示例,但我无法使其工作。 每次我试着运行它,我都会得到: 线程“main”org.hibernate.hibernate.hibernateException:无法在org.hibernate.engine.JDBC.connections.internal.BasicConnectionCreator.createConnection(BasicConnec

  • 问题内容: 我是Socket.IO的100%新手,并且刚刚安装了它。我试图遵循一些示例,并且可以使服务器端运行,但似乎无法使客户端连接。 以下是我的server.js: 这是我的index.html 当我执行node server.js时,它指示socket.io已启动。 当我加载index.html时,出现一行,指出“调试-服务静态/socket.io.js”,但除此之外,没有控制台消息或其他行

  • 本文向大家介绍Dapper.NET 基本多个结果示例,包括了Dapper.NET 基本多个结果示例的使用技巧和注意事项,需要的朋友参考一下 示例 要在单个查询中获取多个网格,请使用该QueryMultiple方法。然后,您可以通过对返回的连续调用顺序检索每个网格GridReader。            

  • 本文向大家介绍PHP抽象类基本用法示例,包括了PHP抽象类基本用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP抽象类基本用法。分享给大家供大家参考,具体如下: 运行上述代码,会提示如下错误信息: Fatal error: Class Managers contains 1 abstract method and must therefore be declared abstr