关于使用AsyncTaskLoader的使用

Android异步处理之AsyncTaskLoader简单使用 不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求。如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的Android程序员。 阅读详情

简介

不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求。如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的Android程序员。

通常情况下我们使用的最多的Android异步处理方法是AsyncTask和Handler,但今天要给大家带来的是大家不常使用的AsyncTaskLoader的使用方法。

AsyncTaskLoader从名字看出来它似乎和AsyncTask有关系,看一下Google官方是怎么给AsyncTaskLoader下定义的:

Abstract Loader that provides an AsyncTask to do the work

果然是样,AsyncTaskLoader是使用一个AsyncTask来进行异步处理的。那么问题来了,既然都有了AsyncTask了为什么还要搞出来一个AsyncTaskLoader呢?

其实AsyncTaskLoader远没有大家想的那么简单。说的通俗一点,如果把AsyncTask比作一台烤面包机的话,那么AsyncTaskLoader就是操作烤面包机的面包师。AsyncTask如同烤面包机接受命令完成面包的烤制任务,一旦任务完成它就停止了工作。然而AsyncTaskLoader如同面包师一样要根据顾客的需求来使用烤面包机。顾客会不停的光顾,那么面包师就会不停的使用烤面包机烤面包。

具体事例

下面我们就通过烤面包机和面包师的例子来演示一下AsyncTaskLoader的使用方法。

首先肯定少不了面包师(Baker):

package com.example.asyncloaderdemo;

import java.util.ArrayList;
import java.util.List;

import android.content.AsyncTaskLoader;
import android.content.Context;

public class Baker extends AsyncTaskLoader<List<Bread>> {

    // 用于查询当前需要多少个面包
    BakeryCallback mCallback;

    //面包房回调,用于获得当面面包需求量
    interface BakeryCallback {
        int getNeededBreads();
    }

    public Baker(Context context, BakeryCallback callback) {
        super(context);
        mCallback = callback;
    }

    @Override
    public List<Bread> loadInBackground() {
        List<Bread> breads = new ArrayList<Bread>();
        //获得当前需要做的面包
        int needs = mCallback.getNeededBreads();
        for (int i = 0; i < needs; i++) {
            //制作面包,耗时操作
            breads.add(new Bread());
        }
        //面包制作完成
        return breads;
    }

    @Override
    public void deliverResult(List<Bread> data) {
        super.deliverResult(data);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }

    @Override
    protected void onReset() {
        super.onReset();
    }
}

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

面包师有了,面包房(Bakery)也不能少

package com.example.asyncloaderdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

public class Bakery extends BroadcastReceiver {

    final Baker mBaker;

    public static String CUSTOMER_ACTION = "com.example.asyncloaderdemo.new_customer" ;

    public Bakery(Baker baker) {
        mBaker = baker;
        IntentFilter filter = new IntentFilter(CUSTOMER_ACTION);
        baker.getContext().registerReceiver(this, filter);
    }

    @Override public void onReceive(Context context, Intent intent) {
        //通知面包师来客人了,要做面包了。
        mBaker.onContentChanged();
    }

}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

面包房和面包师都有了,还缺一个场景(MainActivity)

package com.example.asyncloaderdemo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.example.asyncloaderdemo.Baker.BakeryCallback;

import android.support.v7.app.ActionBarActivity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Intent;
import android.content.Loader;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends ActionBarActivity {

    private LoaderCallbacks<List<Bread>> mCallbacks;
    //面包房
    private Bakery mBakery;
    //面包师
    private Baker mBaker;
    //面包需求量
    private int mNeededBreads;
    //唯一标识
    private final int mLoaderId = 42;

    private BakeryCallback mBreadCallback = new BakeryCallback() {
        @Override
        public int getNeededBreads() {
            return mNeededBreads;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mNeededBreads = 0;
        mBaker = new Baker(this, mBreadCallback);
        mBakery = new Bakery(mBaker);
        mCallbacks = new LoaderCallbacks<List<Bread>>() {

            @Override
            public Loader<List<Bread>> onCreateLoader(int id, Bundle args) {
                if (mBaker == null) {
                    mBaker = new Baker(MainActivity.this, mBreadCallback);
                }
                return mBaker;
            }

            @Override
            public void onLoadFinished(Loader<List<Bread>> loader, List<Bread> data) {
                mNeededBreads = 0 ;
                //面包师完成面包烤制
                Log.d("scott", "sell " + data.size() + " breads") ;
            }

            @Override
            public void onLoaderReset(Loader<List<Bread>> loader) {

            }
        };
        //面包师开始工作
        getLoaderManager().restartLoader(mLoaderId, null, mCallbacks);
        //顾客开始上门
        mockCustomer();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mBakery);
    }

    //模拟源源不断的顾客需求
    private void mockCustomer(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(3000);
                        Random random = new Random();
                        mNeededBreads =random.nextInt(10);
                        Intent intent = new Intent(Bakery.CUSTOMER_ACTION);
                        sendBroadcast(intent);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

接下来我们来看一下程序运行结果: 
面包房运行结果 
通过上图并结合代码可以看出来每隔三秒就会有新的顾客上门,顾客上门后面包房通知面包师需要做面吧哦了,接着面包师就会在后台不停的开始使用面包机(AsyncTask)做面包。

总结

说到这里可能有些同学有疑问了,我怎么从头到尾都没有开到AsyncTask的影子呢?你当然看不到,这就是AsyncTaskLoader设计精妙之处,它做到了让你唯一需要考虑的就是烤面包(异步处理)这个事物逻辑,而不需要考虑异步处理本身的实现上。同时这也充分体现了设计模式中的单一职责和最少知道原则。

使用场景

AsyncTaskLoader一般使用在数据源处于不断更新并且请求刷新数据源是个耗时操作的情况下还需要UI去同步更新相关数据的场景(这句话怎么这么拗口)。

WK2124与STM32 HAL I²C通信实战:时序校准与可靠性落地 I²C通信是嵌入式系统中连接传感器与MCU的基础总线协议,其核心在于物理层电气特性、时序容限与主机驱动行为的精确匹配。WK2124作为高精度温湿度二合一电容式传感器,对SCL低电平时间、上升沿陡峭度、重复起始条件及ACK响应窗口极为敏感,暴露出标准HAL库在真实芯片交互中的抽象失配问题。通过CubeMX精细化配置(100kHz标准模式、禁用模拟滤波、GPIO速度设为Very High)、HAL底层补丁(绕过STOP-START陷阱、显式控制重复起始)以及芯片级初始化序列(含校准触发与延时对齐),可构建稳定可 阅读详情

相关推荐

async-loader:异步模块加载器

异步加载器 用于加载 JavaScript 模块的轻量级异步模块加载器。 依赖关系 没有任何 入门 npm install async-loader --save-dev 应用程序接口 ##AsyncLoader~load(moduleName, path) 返回一个promise 参数 moduleName String - 由路径脚本加载的导出源模块的名称 path String - 要加载的脚本的相对或绝对路径 例子 < script src =" node_modules/dist/async-loader.min.js " > </ script > < script > document . addEventListener ( 'DOMContentLoaded' , function ( ) { AsyncLoader . load

Android学习之AsyncTask和AsyncTaskLoader

根据安卓源码对比AsyncTask与AsyncTaskLoader的不同点

源码在手 1987

Android异步任务处理之AsyncTaskLoader的使用

Android异步任务处理之AsyncTaskLoader的使用

Android学习笔记 87.AsyncTask 和 AsyncTaskLoader

Android学习笔记 87.AsyncTask 和 AsyncTaskLoader

代码改变世界 770

AD9361数字调制入门:从IQ调制原理到动手实现第一个ASK信号(Vivado工程详解)

本文详细介绍了如何使用AD9361射频收发器实现ASK数字调制,从IQ调制原理到Vivado工程实现。通过Verilog代码示例和FPGA架构设计,帮助开发者理解纯逻辑实现数字调制解调的关键技术,特别适合软件无线电(SDR)初学者入门实践。

weixin_29158047的博客 374

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1380

AsyncTaskLoader使用方法

该文章来自我自己的新博客:AsyncTaskLoader解析 AsyncTaskLoader ↳ android.support.v4.content.Loader&amp;amp;amp;lt;D&amp;amp;amp;gt; ↳ android.support.v4.content.AsyncTaskLoader&amp;amp;amp;lt;D&amp;amp;amp;gt; ``` # 基本用法 ## 创建一个继承于AsyncTask

I am Grooter... 947

STM32CubeIDE开发环境搭建与GPIO控制实战

嵌入式开发中,MCU开发环境构建是软硬件协同的起点,其核心在于工具链选型、外设抽象层级与调试可靠性。HAL库作为ST官方标准硬件抽象层,通过统一接口屏蔽芯片差异,显著提升工程可移植性;而STM32CubeIDE则以图形化配置+自动生成代码的方式,实现‘配置即代码’的确定性开发范式。该组合在教学验证、原型迭代和中小规模量产中具备高性价比技术价值,广泛应用于智能传感、工业HMI及IoT终端等场景。本文聚焦STM32CubeIDE 1.15.0环境部署、MyST账户与固件包管理、ST-LINK驱动校验,以及基于H

weixin_33531560的博客 81

Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用

  在Android3.0中,引入了LoaderManager的用法,可以对数据进行异步查询、载入、及时刷新,相比在UI线程中进行此类操作,大大提高了CPU的运行效率与反应时间;   LoaderManager的使用有两种方式,一种是继承AsyncTaskLoader,另一种是使用CursorLoader。 AsyncTaskLoader的使用:   首先,应该得到LoaderMana...

FightFightFight的博客 1766

计算机专业保研攻略(一):个人定位与院校推荐(必看干货)

写在最前 又是一年保研季,作为过来人,我深知保研就是一场信息战。在保研过程中,需要注意的信息太多了,最初我也因为经验不足,走了不少弯路。我写下这篇博客,希望能帮助更多有需要的同学。 怎样做好保研信息分析 我想举几个发生在我身边真实的例子: A同学推免排名不如B同学,但A保研去向比B同学好很多; C同学在年级里成绩并不算突出,但他拿到了最好的offer; D、E同学纷纷圆梦北大、浙大等名校,但是他们的成绩似乎并不突出; F同学取得了目标院校夏令营offer,但没有拿到本校推免资格; G同学认为自己拿不到推免

乔卿的博客 8390

Jetson AGX Orin和Drive AGX Orin相机的关联分析和编程指南

通过适当的相机接口和连接,以及使用适当的软件开发环境,开发人员可以在这些平台上实现相机功能。Jetson AGX Orin和Drive AGX Orin是NVIDIA推出的两款强大的计算平台,用于自动驾驶和人工智能应用。Jetson AGX Orin和Drive AGX Orin平台提供了强大的计算能力,使开发人员能够实现复杂的相机功能和算法。以上只是一些示例,Jetson AGX Orin和Drive AGX Orin平台提供了丰富的开发资源和工具,可用于实现各种复杂的相机应用。显示图像在一个窗口中。

CyberLynxO的博客 1121

使用AsyncTaskLoader加载数据

使用AsyncTask执行数据请求,如果当前在Activity关闭后还没有执行完成,那么Activity的就会被持有,因而导致内存泄漏,通常我们的做法是在Activity或者Fragment中的onDestory()方法中做一些数据清理工作,以及引用持有的清理工作,而AsyncTaskLoader 有生命周期的管理则会帮我们处理好这些。

goodbranch的博客 484

UG二次开发GRIP刻字

UG二次开发GRIP刻字

qq285503851的博客 1138

AsyncTaskLoader1 自定义AsyncTaskLoader使用实例:面包师

简介 不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求。如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的Android程序员。 通常情况下我们使用的最多的Android异步处理方法是AsyncTask和Handler,但今天要给大家带来的是大家不常使用的AsyncTaskLoader的使用方法。

sinat_31820805的博客 653

面向非平行语料的语音转换技术综述

摘要语音转换是语音及人工智能领域的一项研究课题,其目标是在保持源语音内容不变的情况下改变语音的音色,使其听上去像是由另一个目标说话人说出的,同时还需保证语音的质量和自然度。面向非平行语料的语音转换技术是当下的热门研究内容,其使用非平行的多说话人语音数据集进行模型训练,能完成多对多以及任意对任意的语音转换。对近年来面向非平行语料的语音转换进行了全面的总结和分析。首先概述了早期面向平行语料的语音转换及其缺陷,然后对当下面向非平行语料的语音转换的各类实现方法进行介绍和对比分析,最后对语音转换技术进行了总结和展望。

qq_61890005的博客 829

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

首先该问题的出现是由于网络的震荡导致,这是重点。(1)将源更换成阿里云的官方源,步骤参考如上(2)同时将zabbix的官方源更换成阿里云里面的zabbix镜像源,因为zabbix官方源根本网络不通,因为国家防火墙的拦截,导致网络不通。这是阿里源的zabbix镜像地址: https://mirrors.aliyun.com/zabbix/zabbix/4.4/rhel/7/修改系统中早期生成的zabbix.repo文件,如下:主要是把baseurl替换成阿里云的zabbix镜像地址即可。

专注基础架构领域 3875

Android 使用AsyncTaskLoader获取手机联系人

public class MainActivity extends Activity implements LoaderCallbacks{ private ListView listview; private TextView tvEmpty; private SimpleCursorAdapter adapter ; @Override protected void onCreat

luffy207的博客 742

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用AsyncTaskLoader获取本地数据(图片)

在项目中用到了AsyncTaskLoader来获取本地的图片,没错,就是它,不是AsyncTask;刚看见这个类的时候有些疑惑,想必它肯定和AsyncTask有什么联系,于是网上查找了一些资料,其实它们最主要的区别就是:AsyncTaskLoader只用来获取数据,它不考虑和UI交互,而AsyncTask可以获取数据并将数据展示在UI上。于是,写了一个demo使用AsyncTaskLoader类来

wyb112233的专栏 681

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[Android Pro] Android异步任务处理之AsyncTaskLoader的使用

reference to :http://blog.youkuaiyun.com/happy_horse/article/details/51518280 最近项目中涉及到加载本地的地名.db文件,数据量大,自然不能直接放在UI线程中操作,好在Google在Android3.0以后,提供了AsyncTaskLoader来做一些耗时的异步任务。 一 官方对Asyn...

weixin_34358365的博客 140

Android自定义AsyncTaskLoader的使用

使用自定义AsyncTaskLoader加载数据,遵循Google推荐的代码风格,使代码更优美,使代码富有灵魂。

qq_16551423的专栏 689

AsyncTask 和 AsyncTaskLoader 的使用

上一篇 JSON学习 中介绍了 JSON 对象的结构,如何解析 JSON 数据,但是我们的 JSON 数据是本地已经转换的 String 类型,现在我们处理网上的 JSON 数据,用到了网上的操作,必然要进行网络的连接,讲到网络部分,有必然使用到多线程,所以本篇侧重于介绍多线程部分。 为什么要使用多线程?我们最初的 Android 学习中,默认都是在主线程( MainThread )进行操作的,主线

有情绪的仙人掌 985

自定义的AsyncTaskLoader类使用指南

Android源码里面一个自定义的AppListLoader,来示例如何使用AsyncTaskLoader及LoaderManager,这里做了一部分改动,方便梳理代码! LoaderActivity.java package com.example.loadercustom; import java.io.File; import java.text.Collator; import j

羊之草叶的专栏 1007
上一篇: 关于loader asyncTaskLoader AsyncTask的理解
下一篇: 关于数据库与LoaderManager的联合使用,节流???。。。。。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值