Android - 开发实例(9):使用Loader进行数据加载

Android Loader LoaderManager 总结(一) 前言: 本篇文章是对Loader 和 LoaderManager使用和梳理 问题描述 提示:这里描述项目中遇到的问题: 例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据 APP 中接收数据代码: @Override public void run() { bytes = mmInStream.read(buffer); mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();.... 阅读详情

Android3.0 开始提出Loader和LoaderManager的概念,通过LoaderManager类可以很轻松的从Fragment或Activity 中进行异步加载数据。

这和AsyncTask很类似,但是AsyncTask没有LoaderManager的统一管理,并且不方便实现MVC的开发模式,对于和UI相关的数据加载就不要使用AsyncTask使用Loader最佳!

官方示例:

http://developer.android.com/reference/android/app/LoaderManager.html

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

当然我们实际开发中,需要自己去实现一个更加酷的Loader,来满足我们的开发需要。

BaseDataLoader.java  -- 一个基础Loader,提取于AsyncTaskLoader.html的示例代码,并做了自己的处理。

package cn.gavinliu.loader;

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

/**
 * 这是一个基础的数据加载Loader
 * 
 * @author Gavinliu
 * @param <T>
 * 
 */
public abstract class BaseDataLoader<T> extends AsyncTaskLoader<T> {

	private T mData;

	public BaseDataLoader(Context context) {
		super(context);
	}

	/**
	 * Handles a request to start the Loader.
	 */
	@Override
	protected void onStartLoading() {
		if (mData != null) {
			// If we currently have a result available, deliver it
			// immediately.
			deliverResult(mData);
		}

		registerObserver();

		if (takeContentChanged() || mData == null || isConfigChanged()) {
			// If the data has changed since the last time it was loaded
			// or is not currently available, start a load.
			forceLoad();
		}
	}

	/**
	 * Called when there is new data to deliver to the client. The super class
	 * will take care of delivering it; the implementation here just adds a
	 * little more logic.
	 */
	@Override
	public void deliverResult(T data) {
		if (isReset()) {
			// An async query came in while the loader is stopped. We
			// don't need the result.
			if (mData != null) {
				onReleaseResources(mData);
			}
		}
		T oldApps = mData;
		mData = data;

		if (isStarted()) {
			// If the Loader is currently started, we can immediately
			// deliver its results.
			super.deliverResult(data);
		}

		// At this point we can release the resources associated with
		// 'oldApps' if needed; now that the new result is delivered we
		// know that it is no longer in use.
		if (oldApps != null) {
			onReleaseResources(oldApps);
		}
	}

	/**
	 * Handles a request to stop the Loader.
	 */
	@Override
	protected void onStopLoading() {
		// Attempt to cancel the current load task if possible.
		cancelLoad();
	}

	/**
	 * Handles a request to cancel a load.
	 */
	@Override
	public void onCanceled(T data) {
		super.onCanceled(data);

		// At this point we can release the resources associated with 'apps'
		// if needed.
		onReleaseResources(data);
	}

	/**
	 * Handles a request to completely reset the Loader.
	 */
	@Override
	protected void onReset() {
		super.onReset();

		// Ensure the loader is stopped
		onStopLoading();

		// At this point we can release the resources associated with 'apps'
		// if needed.
		if (mData != null) {
			onReleaseResources(mData);
			mData = null;
		}

		unregisterObserver();
	}

	protected boolean isConfigChanged() {
		return false;
	}

	protected void registerObserver() {
	}

	protected void unregisterObserver() {
	}

	protected void onReleaseResources(T mData) {
	}

}

MainActivity.java -- 使用示例

package cn.gavinliu.loader;

import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.Loader;
import android.os.Bundle;

public class MainActivity extends Activity implements LoaderCallbacks<String> {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		getLoaderManager().initLoader(0, null, this);

	}

	@Override
	public Loader<String> onCreateLoader(int id, Bundle args) {
		System.out.println("onCreateLoader");
		mLoader = new MyLoader(getApplicationContext());
		return mLoader;
	}

	@Override
	public void onLoadFinished(Loader<String> loader, String data) {
		System.out.println("onLoadFinished");
		System.out.println("----->" + data);
	}

	@Override
	public void onLoaderReset(Loader<String> loader) {
		System.out.println("onLoaderReset");
	}

	private MyLoader mLoader;

	static class MyLoader extends BaseDataLoader<String> {
		String mData;

		public MyLoader(Context context) {
			super(context);
		}

		@Override
		public String loadInBackground() {
			System.out.println("LoadInBackground");
			return "Load Success";
		}

	}

}


Android 深入理解Loader机制 让APP轻装上阵 本文简书同步发布,谢谢关注。 http://www.jianshu.com/p/8b83b8b6e931 Android开发者都经历过APP UI开发不当 会造成overDraw,导致APP UI渲染过慢,但是很多人却没听过overLoad,overLoad一般是由于开发者在主线程操作耗时操作,导致程序变慢 甚至出现的anr的现象,那么android早已为这种现象提供完美的解决方案,就是今天给大家说 阅读详情

相关推荐

Android Loader详解

一,android装载器基本方法 装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性: 它们对每个Activity和Fragment都有效。 他们提供了异步加载数据的能力。 它们监视数据源的一将一动并在内容改变时传送新的结果。 当由于配置改变而被重新创建后,它们自动重连到上一个加载

xiangzhihong8的专栏 8506

从头编译带Vulkan支持的PyTorch以及PyTorch的Android库

如何编译带Vulkan支持的PyTorch以及Android库,并在Android设备上通过Vulkan调用GPU进行推理

entalent的专栏 7161

掌握Android Loader的高级数据加载技术

本文将深入探讨Android中的Loader类,它是一种高层次的模式,用于异步加载内容提供者或数据源的内容,并具备内容变更检测与生命周期感知的能力。通过Loader,开发者可以在Activity和Fragment中有效管理数据加载,同时确保应用响应性和性能。我们将通过实际案例,介绍如何使用LoaderManager、LoaderCallback以及不同的Loader实现来构建响应式应用。

weixin_26907223的博客 938

Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据

1.Loader特性: (1).对于每个Activity或者Fragment都可用 (2).提供异步加载数据 (3).监视数据资源,当内容改变时重新更新 (4).当配置改变时,自动重新连接最新的cursor,故不需要重新查询数据 2.Loader相关类接口 (1).LoaderManager 对于每个activity或者fragment只存在一个与之相关的Lo

棒怡情的专栏 2909

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

[STM32H750]HAL库下FMC驱动正点原子MCU屏的移植与优化

本文详细介绍了在STM32H750平台上使用HAL库移植与优化正点原子MCU屏幕驱动的完整过程。重点解析了FMC硬件配置、Cache一致性处理、精确延时实现等关键技术难点,提供了实用的移植方案和性能优化技巧,帮助开发者高效解决屏幕显示问题。

rock5的博客 286

学习记录——Pytorch模型移植Android小例子

学习记录——Pytorch模型移植Android小例子

weixin_44438341的博客 1万+

STM32H743VIT6最小系统板PCB设计全流程(AD09实战教程+封装库分享)

本文详细介绍了基于STM32H743VIT6高性能MCU的最小系统板PCB设计全流程。内容涵盖从项目规划、原理图设计到PCB布局布线的AD09实战操作,重点解析了高速电路设计中的电源、时钟、去耦等关键模块的处理要点与常见陷阱,并分享了经过验证的封装库资源,旨在为工程师提供一套完整、可靠的设计方法与实战参考。

weixin_29194693的博客 118

Android 使用Loader示例

  Android 3.0 sdk,引入了很多新api,比如Loader。和Fragment类似(编写兼容android1.6的fragment),该api也可在Android 1.6以上版本执行。以下介绍如何编写Loader,实现对ListView的异步加载。效果如图: 示例中有一个后台线程每隔3秒更新数据库的长江记录,将记录改为“长江”或“Long River”。ListView无需监控数...

weixin_34360651的博客 123

Anaconda+Pycharm安装

我提前创建好一个自己项目所需的虚拟环境。步骤是:打开终端(cmd)或者 搜索 ”Anaconda Prompt“ 并打开,输入 conda create -n pytorch python=3.9 -c。

Wang_sweet的博客 3232

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

Android加载器Loader使用

假设我们现在需要读取数据库中的联系人,如果联系人很多的话,我们必须将查询数据库的操作逻辑放在子线程中,不然会导致UI线程阻塞,然后再及时将查询到的数据告知显示界面让其刷新. 其次,如果联系人数据库中数据变化了,我们还需要通过观察者模式的ContentObserver类中的onChange方法来监听相应的数据库改变,然后再重新查询,排序,刷新等等(这里不对ContentObserver内容观察者做

花花大神的专栏 3448

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 810

Android 使用Loader加载联系人

Android 的装载器(Loader)是从Android3.0之后新引入的API,主要完成单线程耗时数据异步装载功能,并在数据有更新时自动通知UI刷新,业内也叫加载器,装载机。   一个使用装载器的的应用会包含以下组件: 1:一个Activity或者Fragment

dhl_1986的博客 1152

记录:解决Ubuntu20.04安装ros报错E: Unable to locate package ros-kinetic-desktop-full【亲测有效】

报错:E: Unable to locate package ros-kinetic-desktop-full.尝试好久一直都无法下载,最后得知真相的我眼泪哗哗的直流。

**My Coding Family** 6万+

在YOLO中扩充新类别并且不影响旧类的识别精度

让我们先从简单的部分开始:用我们的新类训练自定义 YOLOv8 模型。在本教程中,我们将向模型添加车牌类。我们将使用Roboflow 中的一个数据集。这个数据集有两个车牌类。在开始训练之前,我们还必须对库进行一些更改。为了节省时间,我还将本教程中我们将进行的更改转换为补丁该补丁包含多项更改,但大多数更改都用于指南的下一部分。if RANK!= -1:是的,我们将编写一个回调。我们希望将此自定义训练模型的头部与 COCO 预训练模型中的旧头部一起使用。

如果想成为中心,那么就到中心去吧。 1225

android loader使用教程,Android Loader 机制,让你的数据加载更加轻松

前言在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下1、Thread + HandlerThread + Handler2、AsyncTaskAsyncTask3、LoaderLoader前面两种异步加载方式,相信大家是比较熟悉的,但是第三种方式,可能有些人是没怎么接触过的,其实在 C...

weixin_39980929的博客 641

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android Loader 数据异步加载

文章目录1、简介2、耗时加载数据常用方式1) Thread + Handler![在这里插入图片描述](https://img-blog.csdnimg.cn/20200409210014534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0...

Venus 的博客 880

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android loader 使用教程,Android Studio教程09-加载器Loader的使用

目录1.加载器特征用于每个 activity 和 fragment支持异步加载数据。监控其数据源并在内容变化时传递新结果。2. loader api3. 在应用中使用loader主要步骤activity 或 fragmentloadermanager 的实例一个 cursorloader,用于加载由contentprovider 支持的数据。您也可以实现自己的 loader或 asynctaskl...

weixin_42469444的博客 557

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android Loader 异步加载数据

一、Loader简介: (一)Loader的概念: 装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据(数据库的数据,包括本地数据库,包括共享数据库)变得简单。 装载器具有如下特性: 它们对每个Activity和Fragment都有效; 他们提供了异步加载数据的能力; 它拥有一个数据改变通知机制,当数据源做出改变时会及时通知。 也就是可以监听数据源,一旦数据源发

NoOneCode的博客 573

Android Loader(加载器)详解

Loader(加载器)简介 Android 3.0 中引入了加载器,支持轻松在 Activity 或Fragment中异步加载数据。 加载器具有以下特征: (1)可用于每个 Activity 和 Fragment。 (2)支持异步加载数据。 (3)监控其数据源并在内容变化时传递新结果。 (4)在某一配置更改后重建加载器时,会自动重新连接上一个加载器的 Cursor。 因此

Wtoria的博客 3466

安卓开发 之小白养成-Loader异步加载

什么是Loader Loader从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性: 1、 它们对每个Activity和Fragment都有效。 2、他们提供了异步加载数据的能力。 3、 它们监视数据源的一举一动并在内容改变时及时通知客户端。 4、当由于配置改变而被重新创建后,它们自动重连到上一...

qq_34506989的博客 283

Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Thread + Handler 2、AsyncTask Asyn...

chuanao8829的博客 209

Android—Loader异步加载

一、Loader简介: (一)、Loader的概念: 装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性: 它们对每个Activity和Fragment都有效。 他们提供了异步加载数据的能力。 它拥有一个数据改变通知机制,当数据源做出改变时会及时通知。  当Cursor

ZhangleGalaxyShare的博客 621

Android中的数据加载机制-Loader(一)

Android中的loader

qq_36162336的博客 1071

Android之Loader和LoaderManager使用

1.Loader作用顾名思义即是指加载器,用于异步加载数据,Android 3.0 中引入了加载器,支持轻松在 Activity 或片段(Fragment)中异步加载数据;a.在单独的线程中读取数据(耗时操作),不用阻塞UI线程的执行;b.监听数据源是否发生变化传递新的结果(观察者模式);2.Loader和LoaderManager使用示例/** * Loader测试类 */ public ...

Tiger的专栏 772
上一篇: Chrome Version33+ 设置自定义CSS的方法
下一篇: Android - 开发实例(10):让控件变得可拖拽
刘云龙在搞机
博客等级 码龄14年 57粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值