• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Loader加载器,loader加载

Loader加载器,loader加载

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了asi loader加载器,imageloader加载图片,imageloader加载gif,windows7loader,windows loader等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Loader加载器,loader加载


今天学到了这个Loader,浅谈一下自己的看法:

1.定义

Loader是一个加载器,可以用来它访问数据,可以看做访问数据的机器(好比挖掘机)。装再器从android3.0开始引进,它使得在activity或fragment中异步加载数据变得简单。

具有如下特别:

1)它们对每个Activity和Fragment都有效

2)它们提供了异步加载数据的能力

3)它拥有一个数据改变通知机制,当数据源做出改变是会及时通知。当Cursor发生变化时,会自动加载数据,因此不需要重新进行数据查询

解释一下为什么会有异步加载数据的能力:

final class LoadTask extends ModernAsyncTask<Void, Void, D> implements Runnable {
private final CountDownLatch mDone = new CountDownLatch(1);

// Set to true to indicate that the task has been posted to a handler for
// execution at a later time. Used to throttle updates.
boolean waiting;

/* Runs on a worker thread */
@Override
protected D doInBackground(Void... params) {
if (DEBUG) Log.v(TAG, this + " >>> doInBackground");
try {
D data = AsyncTaskLoader.this.onLoadInBackground();
if (DEBUG) Log.v(TAG, this + " <<< doInBackground");
return data;
} catch (OperationCanceledException ex) {
if (!isCancelled()) {
// onLoadInBackground threw a canceled exception spuriously.
// This is problematic because it means that the LoaderManager did not
// cancel the Loader itself and still expects to receive a result.
// Additionally, the Loader's own state will not have been updated to
// reflect the fact that the task was being canceled.
// So we treat this case as an unhandled exception.
throw ex;
}
if (DEBUG) Log.v(TAG, this + " <<< doInBackground (was canceled)", ex);
return null;
}
}
protected D onLoadInBackground() {
return loadInBackground();
}
public abstract D loadInBackground();
这是AsyncTaskLoader底层代码实现。可以看出,在AsyncTaskLoader中创建一个final修饰的内部类,实现异步任务。封装了一个抽象方法loadInBackground(),在子类继承时,实现各自的实现方式。

2.作用

用来加载数据,访问数据库(系统自带的数据库,自定义数据库)。当然访问数据库,我们可以使用ContentResolver通过query()访问数据库,得到一个Cursor对象,遍历这个对象就可以拿到我们想要的数据。但Loader的作用比ContentResolver更简便更快捷。

3.用法(使用装载器时设计到的类和方法)

LoaderManager:本身是一个抽象类。关联到每一个Activity或Fragment,管理一个或多个装载器的实例。这帮助一个应用管理那些与Activity或Fragment的声明周期相关的长时间运行的操作。最常见的方式是与一个CursorLoader一起使用,然而应用是可以随便写它们自己的加载器从而加载其他类型的数据。

LoaderManager.LoaderCallBack<D>:本身是一个接口。一个用于客户端与LoaderManager交互的回调接口。如:你可以使用onCreateLoader()创建一个Loader加载器

Loader:本身是一个抽象类。一个执行异步数据加载的抽象类。它是加载器的基类,你可以使用典型的CursorLoader,但是你也可以使用自定义的Loader(创建一个类extends AsyncTaskLoader),它们将监试它们的数据源并且在数据改变是发送新的结果。

AsyncTaskLoader:本身是一个抽象类,提供一个AsyncTask来执行异步加载工作(工作在子线程,进行耗时操作)。

CursorLoader:AsyncTaskLoader的实现类。

4.我自己写的一个demo访问手机联系人

package com.yz.searchcontacts;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

private ListView lv_contacts;
private SearchView msv_name;
private static ContentResolver mResolver;
private SimpleCursorAdapter mAdapter;
private LoaderManager manager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
msv_name = (SearchView) findViewById(R.id.sv_name);
lv_contacts = (ListView) findViewById(R.id.list_item);
//创建适配器
mAdapter = new SimpleCursorAdapter(this, R.layout.list_item,null,new String[]{"_id","display_name"},new int[]{R.id.tv_id,R.id.tv_name},SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv_contacts.setAdapter(mAdapter);
//创建loader加载器,并初始化
manager = getSupportLoaderManager();
manager.initLoader(1,null,this);
//获取ContentResolver
mResolver = getContentResolver();
}


@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

return new MyLoader(this,args);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

mAdapter.swapCursor(data);
//为SearchView设置监听
msv_name.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

@Override
public boolean onQueryTextChange(String newText) {
Bundle args = new Bundle();
args.putString("name",newText);
manager.restartLoader(1,args,MainActivity.this);
return true;
}
});
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
//自定义Loader
static class MyLoader extends AsyncTaskLoader<Cursor>
{
private Bundle args;
public MyLoader(Context context,Bundle args) {
super(context);
this.args = args;
}

@Override
protected void onStartLoading() {
super.onStartLoading();
//强制加载
forceLoad();
}

@Override
public Cursor loadInBackground() {
//进行耗时操作
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
if (args != null) {

Cursor cursor = mResolver.query(uri, new String[]{"_id", "display_name"}, "display_name like ?", new String[]{"%" + args.getString("name") + "%"}, null);
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Loader加载器,loader加载

相关文章

  • 2017-05-26Android实现按两次back键退出应用,android两次back键
  • 2017-05-26ULog远程日志——让Android调试更加方便直观
  • 2017-05-26Docker+Redis3集群环境搭建
  • 2017-05-26Android 正则表达式验证手机号、姓名(包含少数民族)、身份证号,android正则表达式
  • 2017-05-26Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid
  • 2017-07-23一键生成Android录屏gif的脚本
  • 2017-05-26Android提权漏洞CVE-2014-7920&amp;CVE-2014-7921分析,android提权漏洞
  • 2017-05-26手机产品设计之用户引导,手机产品设计引导
  • 2017-05-26redis master-slave 切换演练
  • 2017-05-26Android 学习之路,android学习之路

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android 代码动态改变View的属性
    • iTween基础之功能简介,itween功能简介
    • Android 数据库操作,android数据库操作
    • Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知),android.qq5.0
    • Android 无标题 全屏设置,android无标题全屏
    • Android—ZXing二维码扫描遇到的问题,androidzxing
    • 内核内存分配常用函数使用
    • Android 博客园客户端 (五) 查看评论、搜索博主,android查看评论
    • Android中使用开源框架android-image-indicator实现图片轮播部署,
    • ListView的CheckBox实现全部选中/不选中,listviewcheckbox

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有