Android Loader简单使用_onloaderapk-程序员宅基地

技术标签: CursorLoader  android笔记  

Loader在Android3.0引进,它让异步加载数据变得容易。

特征:

1.在Activity、Fragment中都可以使用

2.Loader可以提供异步加载数据

3.监视数据源的变化,当数据源发生变化的时候,会传递新的数据

4.当loader重建的时候,会自动链接到最后一个Loader的cursor数据上,而不去进行重新查找。

在app中使用Loader的时候,可能使用到的类和接口:

LoaderManager:这是一个抽象类,关联在Activity、Fragment上,管理一个或多个Loader,帮助app管理耗时操作在Activity、Fragment的生命周期过程中。最常和CursorLoader一块使用。每一个Activity或Fragment只有一个FragmentManager对象。一个FragmentManager可以管理多个Loader

LoaderManager.LoaderCallbacks:和LoaderManger关联在一起的回调接口。onCreateLoader()会调方法,创建Loader对象。

Loader:抽象类,异步加载数据。主要使用CursorLoader。监视数据源的变化,当数据源发生改变的时候,传递新的数据内容。

AsyncTaskLoader:抽象的,提供了一个AsyncTask

CursorLoader:是AsyncTaskLoader的子类,使用ContentResolver查找数据,返回Cursor。加载Cursor数据的时候操作在非UI线程,so,不会阻塞UI线程。该类是查找ContentProvider提供出来的数据的最好的方式。

 

LoaderManager:用它实例化Loader--》cursorLoader

 

使用Loader:

1.Activity、Fragment

2.LoaderManager的实例

3.CursorLoader在后台加载数据--》ContentProvider

4.LoaderManager.LoaderCallbacks实现

5.需要展示数据的:SimpleCursorAdapter

6.数据源:ContentProvider

 

 

在一个Activity、Fragment中,只有一个LoaderManager实例。

 

需要在Activity的onCraete方法中或者是Fragment的onActivityCreated方法中实例化Loader对象:

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


MainActivity.java

public class MainActivity extends Activity implements LoaderCallbacks<Cursor>,OnQueryTextListener{
	private TextView tv;
	private ListView lv;
	private SimpleCursorAdapter cursorAdapter;
	private String filterName=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv=(TextView) findViewById(R.id.tv);
        tv.setText("请稍候");
        
        cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_2, null, new String[]{ContactsContract.Contacts.DISPLAY_NAME}, new int[]{android.R.id.text1},0);
        lv=(ListView) findViewById(R.id.lv);
        lv.setAdapter(cursorAdapter);
        //初始化Loader
        //参数1:实例化Loader数据加载的id
        //参数2:传递参数onCreateLader()方法的第二个参数
        //参数3:回调接口
        getLoaderManager().initLoader(0, null, this);
        
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        SearchView v= (SearchView) menu.findItem(R.id.menu_search).getActionView();
        v.setOnQueryTextListener(this);
        return true;
    }
	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		Uri uri;
		String [] pro = new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID};
		if(TextUtils.isEmpty(filterName)){
			uri=ContactsContract.Contacts.CONTENT_URI;
		}
		else{
			//给当前的Uri最后追加一个 数字或字符串
			uri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI, Uri.encode(filterName));
		}
		//创建Loader对象,开始异步加载数据
		return new CursorLoader(this, uri, pro, null, null, null);
	}
	
	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
		//得到异步加载数据,更新Adapter  
		//交换Cursor,就是把之前已经有的Cursor交换掉,用data,所以起到一个更新的作用
		cursorAdapter.swapCursor(data);
	}
	@Override
	public void onLoaderReset(Loader<Cursor> loader) {
		//移除adapter使用的Loader,系统会释放不再使用的Loader
		cursorAdapter.swapCursor(null);
	}

	@Override
	public boolean onQueryTextSubmit(String query) {
		
		return true;
	}

	@Override
	public boolean onQueryTextChange(String newText) {
		filterName = newText;
		getLoaderManager().restartLoader(0, null, this);
		return false;
	}
}
menu_main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity" >
    <item
        android:id="@+id/menu_search"
        android:actionViewClass="android.widget.SearchView"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="搜索"
        tools:ignore="AppCompatResource">
    </item>
</menu>

效果图:






版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010829905/article/details/47280133

智能推荐

最新MT2503平台技术资料集锦_mt2503和mt2601-程序员宅基地

文章浏览阅读2.2k次。MT2503平台技术资料介绍:包括原理图、参考设计、规格书、源码、FAQ等一系列技术资料,有需要的可到一牛网论坛中下载或者到小编的CSDN资源里下载。此外,还有MT2503平台方案开发,MT2503模块等需要合作的,到一牛网论坛或在下方留言都可以。MT2503_all_feature__GPIO_Mapping_v1_0.rarMT2503_Ballmap_Package_V0.2.zi..._mt2503和mt2601

【MQ篇】Spring Boot 整合 RocketMQ 消息队列_springboot rocketmq队列发送1000条数据抢-程序员宅基地

文章浏览阅读910次。写在最前Docker安装RocketMQRocketMQ 入门必读Spring Boot 整合 RocketMQDemo 地址:mingyue-springboot-rocketmq1.添加依赖<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <_springboot rocketmq队列发送1000条数据抢

【python爬虫专项(9)】哪吒之魔童降世影片的海报爬取_python 爬取电影海报-程序员宅基地

文章浏览阅读1.8k次。以哪吒之魔童降世影片的海报为例进行图片爬取参考网址:哪吒之魔童降世官方海报爬虫逻辑:【分页网页url采集】-【数据采集】-【保存图片】经过前两篇文章的实践,可以发现两种爬虫逻辑各有优缺点,逻辑(一)可以获得相对详细的信息,但是需要从主url中获取分页url再进行数据的爬取,很消耗时间,而逻辑(二)则是直接获取在第一个url上的信息,爬取即可,很省时,当然相对地获取的信息也就较少一些。而这次..._python 爬取电影海报

JEB 3.7.0 Merry Xmas Edition by DimitarSerg-程序员宅基地

文章浏览阅读1.3k次。1. Maximum license type (copying, scripts, etc. work now).2. Fixed integrity check #1.3. Fixed integrity check #2.4. All the telemetry has been cut out.5. Removed the update checks and other shit ..._jeb 3.7.0

《Orthogonal Time Sequency Multiplexing Modulation: Analysis and Low-Complexity Receiver Design》论文笔记_otsm-程序员宅基地

文章浏览阅读737次。1.标题Orthogonal Time Sequency Multiplexing Modulation: Analysis and Low-Complexity Receiver Design2.作者Tharaj Thaj, Emanuele Viterbo, and Yi Hong3.关键词OTFS,WHT,OTSM,Delay_sequency4.词汇OTFS正交时频空间OTSM正交时间序列复用delay_sequency延迟序列delay_Dopp_otsm

【三相旋转磁场】旋转磁场直到指定数量的周期(Matlab代码实现)-程序员宅基地

文章浏览阅读844次,点赞16次,收藏20次。【三相旋转磁场】研究涉及了对旋转磁场直到指定数量的周期的详尽探索,并且在研究过程中绘制了磁场随时间变化的图表。本文将深入探讨三相电机中磁场的旋转特性,包括磁场的形成过程、随时间的演变以及对电机性能的影响。通过对旋转磁场的系统分析,读者将能够更全面地理解三相电机工作原理,从而为电力系统和电机控制领域的进一步研究和应用提供坚实的理论基础。通常情况下,可以通过控制三个相位电流的频率和相位差来控制旋转磁场的速度和方向。要让这个磁场旋转到指定数量的周期,需要控制三个相位电流的频率和相位差。行百里者,半于九十。

随便推点

WEBSHELL-程序员宅基地

文章浏览阅读327次。<?php/*****************************************************************************===================== 请误用于非法用途,造成一切后果与本人无关。====================发布此版本是为了纪念安全天使曾经的辉煌。感谢你们与我一同走过:Sniper\Super...

国内四家AI大模型---转自今日头条|产业互联网研习社_头条的大模型-程序员宅基地

文章浏览阅读326次。笔者主要介绍国内四家AI大模型相关情况_头条的大模型

自定义RatingBar评分动画控件_android 打分星星动画-程序员宅基地

文章浏览阅读541次。KRatingBar先说说,这个控件存在的意义(和原生RatingBar相比):1.自动排列:指定星星数量后,星星自动均等排列2.星星点击动画:算是满足一丢丢少女心吧3.星星数量脱离了RatingBar宽度的控制4.避免星星出现拖影和“流泪”现象5.星星的样式直接调用res的drawable,不用再单独去定义个layer-list总之就是使用更方便一点吧。请看效果:为啥要..._android 打分星星动画

DB2导入数据时乱码问题-程序员宅基地

文章浏览阅读2k次。1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016)解决办法:set integrity for xxxxxx immediate checked2.表锁定(原因码为7)解决办法:reorg table xxxx3.去重select di..._db2 export 默认编码

Java基础教程(3)-Java变量和数组-程序员宅基地

文章浏览阅读237次。定义一个整型变量num:num是标识符号,也叫变量名称,int是变量类型, 10是初始值可选变量分为两种:基本类型的变量和引用类型的变量。在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下:type是Java的基本类型之一,或类及接口类型的名字。标识符(identifier)是变量的名字,指定一个等号和一个值来初始化变量。请记住初始化表达式必须产生与指定的变量类型一样(或兼容)的变量。声明指定类型的多个变量时,使用逗号将各变量分开;

yarn 安装依赖报错 error An unexpected error occurred: https://registry.yarnpkg.com“-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏4次。yarn 安装依赖报错 error An unexpected error occurred: https://registry.yarnpkg.com“