LoaderManager完成异步数据库加载 (loadermanager异步加载数据库)

对于许多Android应用程序来说,数据库是非常关键的一环。随着应用程序规模不断扩大,数据量不断增加,我们需要考虑如何更好地处理数据库操作。传统的数据库访问方法可能会卡住应用程序的主线程,导致用户体验下降。因此,Android提供了一种名为LoaderManager的组件,可以实现异步数据库操作,提升应用程序的性能和用户体验。

LoaderManager概述

LoaderManager是Android系统提供的一组组件,用于异步加载数据。它可以以异步方式获取数据,而无需阻塞UI线程。LoaderManager是一个抽象类,它管理Loader的生命周期,以便它们在Activity或Fragment重新创建期间不会丢失。通过使用LoaderManager,我们可以将应用程序的大部分数据库操作放在后台线程中,从而避免UI线程被阻塞。

Loader的使用

要使用Loader,我们需要首先在应用程序中创建Loader,然后将其与LoaderManager关联。在创建Loader时,我们需要提供一些重要的参数,包括URL、ID和参数。URL是访问数据库的路径,ID是LoaderManager对应于活动或片段的ID。参数是可选的。

“`java

private static final int ID_LOADER_TASKS = 1;

private TaskAdapter mAdapter;

private LoaderManager.LoaderCallbacks mLoaderCallbacks;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mn);

mAdapter = new TaskAdapter(this, null);

mLoaderCallbacks = new LoaderManager.LoaderCallbacks() {

@Override

public Loader onCreateLoader(int id, Bundle args) {

String[] projection = new String[]{

TaskContract.Columns._ID,

TaskContract.Columns.TASK_NAME,

TaskContract.Columns.TASK_DESCRIPTION,

TaskContract.Columns.TASK_SORT_ORDER};

String sortOrder = TaskContract.Columns.TASK_SORT_ORDER + ” COLLATE NOCASE”;

switch(id){

case ID_LOADER_TASKS:

return new CursorLoader(MnActivity.this,

TaskContract.CONTENT_URI,

projection,

null,

null,

sortOrder);

default:

throw new IllegalArgumentException(“Unexpected id : ” + id);

}

}

@Override

public void onLoadFinished(Loader loader, Cursor data) {

mAdapter.swapCursor(data);

}

@Override

public void onLoaderReset(Loader loader) {

mAdapter.swapCursor(null);

}

};

getSupportLoaderManager().initLoader(ID_LOADER_TASKS, null, mLoaderCallbacks);

}

“`

在上面的代码片段中,我们首先创建了一个LoaderCallbacks对象,并实现了三个方法:onCreateLoader、onLoadFinished和onLoaderReset。这些方法在LoaderManager中有特定的作用,我们将在下面详细介绍。

在onCreate方法中,我们首先创建了一个TaskAdapter对象,并将其设置为ListView的适配器,以显示从数据库中检索的任务列表。接下来,我们创建了一个LoaderManager.LoaderCallbacks对象,并用getSupportLoaderManager().initLoader()方法将其与当前Activity的LoaderManager关联起来。这样,在Activity重新创建时,LoaderManager将重新创建加载器,并自动恢复以前的状态。

onCreateLoader

onCreateLoader方法用于创建Loader对象,主要做两件事:我们使用CursorLoader对象从ContentProvider中检索数据,然后向LoaderManager返回该Loader对象。通过传递正确的参数,我们可以实现异步加载数据库中的数据。

“`java

@Override

public Loader onCreateLoader(int id, Bundle args) {

String[] projection = new String[]{

TaskContract.Columns._ID,

TaskContract.Columns.TASK_NAME,

TaskContract.Columns.TASK_DESCRIPTION,

TaskContract.Columns.TASK_SORT_ORDER};

String selection = null;

String[] selectionArgs = null;

String sortOrder;

switch(id){

case ID_LOADER_TASKS:

return new CursorLoader(this,

TaskContract.CONTENT_URI,

projection,

selection,

selectionArgs,

sortOrder);

default:

throw new IllegalArgumentException(“Unexpected id : ” + id);

}

}

“`

在上面的代码片段中,我们首先定义了要访问的列,然后声明了列的排序顺序。接下来,我们在switch语句中检查Loaders的ID。如果它是ID_LOADER_TASKS,我们将创建一个CursorLoader对象,该对象将从TaskContract.CONTENT_URI中检索数据。其他情况下,我们会抛出一个IllegalArgumentException异常。

onLoadFinished

onLoadFinished方法在Loader完成数据加载时被调用。在onLoadFinished方法内部,我们使用CursorAdapter对象将数据填充到ListView中。

“`java

@Override

public void onLoadFinished(Loader loader, Cursor data) {

mAdapter.swapCursor(data);

}

“`

在上面的代码片段中,我们首先检查Loader对象是否是我们正在监听的Loader对象。然后,我们将数据中的每一项填充到ListView中。注意,在销毁一个Loader对象时,需要调用CursorAdapter的swapCursor方法来将其传递到别的Adapter对象,以便释放所有引用的Cursor对象。

onLoaderReset

onLoaderReset方法在Loader被重置后被调用,用于清除数据和UI组件。在我们的示例应用程序中,我们使用CursorAdapter.swapCursor方法将数据置空。

“`java

@Override

public void onLoaderReset(Loader loader) {

mAdapter.swapCursor(null);

}

“`

相关问题拓展阅读:

android学习需要什么条件和基础?android开发需要花多长时间才能入职?

Android基础:

一、Activity学习

Android环境搭建和应用开发体系,Activity生命周期,Activity管理及Intent七大属性,传值,启动和跳转,及Activity中返回栈的讲解,创建一个Android项目HelloWord

二、UI,View学习

UI5大布局,UI常用控件,ListView的使用及优化,图文混排+GridView,ViewPager的使用及优化,Menu+Dialog+Toast+通知,自定义控件的使用,各种资源的定义和使用,Fragment的生命

三、数据存储学习

UI5大布局,UI常用控件,ListView的使用及优化,图文混排+GridView,ViewPager的使用及优化,Menu+Dialog+Toast+通知,自定义控件的使用,各种资源的定义和使用,Fragment的生命

四、ContentProvider学习

ContentProvider与ContentResolver,内容解析者ContentResolver的使用讲解;自定义内容提供者ContentProvider的详细讲解;获取常见的数据类型如音乐,视频,图像,手机通信录联系人信息等

五、Loader学习

实现异步加载数据,LoaderManager管理多个loader,LoaderCallbacks接口中的抽象尺态孝方法,Loader装载器,AsyncTaskLoader异步

六、线程与进程学习­

AsnycTask的特点及子类,AsnycTask泛型参数,AsnycTask常用方法,Handler的使用,Handler原理及消息机制,线程运行周期,线程安全(死锁,线程同步),线程的常用方法,线程交互,线程使用:生产者与消费者,Socket网络编程

七、ON和SVN学习

ON的概念 ONObject,ONStringer,ONArray,ONTokener类的使用,ONException的使用svn的日常

八、Broadcast学习

广播的注册方式,广播的分类,广播的发送,Android中常用的系统广播

九、Service学习

Service生命周期,掌握Service的使用场景,Service的分类,启动Service,Service与Thread之间的区分,BindService的生命周期,AIDL的使用及讲解,Messenger信使的讲解

以上就是成为一名Android开发工程师在初级阶段所要掌握的知识,最后想向大家强调一点,学编程基础一定要打牢陵稿,所有的概念和知识点必须理解透彻,自学的时候往往只是知道这段代码怎么用,却不能理解其中含义,所以成为一名优秀的Android开发工程师不仅要知其然更要知其所以然。闭唯

一般Android工程师在系统的学习下大约4-5个月就可以。

android loaders 什么时候使用

Loaders机制在Android 3.0版本后引入。Loaders机制使一个Activity或者一个Fragment更加容易异步加载数据。Loaders有如下的特性:

Ø  它们适用于任何Activity和Fragment;

Ø  它们提供了异步加载数据的机制;

Ø  它们检测数据源,当数据源内容改变时它们能够传尘举备递新的结果;

Ø  当配置改变后需要重新创建时,它们会重新连接到最后一个loader的游答雀标。这样,它们不需要重新查询它们的数据。

在APP里使用Loaders

一个App里,典型的使用loaders包含的内容如下:

一个Activity或一个Fragment。

一个LoaderManager的实例。

一个CursorLoader,从一个ContentProvider里加载数据。

一个LoaderManager.LoaderCallbacks的实现。在这你创建新的loader,和管理已经存在的loaders。

一种显示loader加载数据的方式,例如SimpleCursorAdapter。

一种数据源,例如一个Conterprovider(当使用CursorLoader)。

这个样例是一个Fragment的实现派毁,它使用ListView显示了通讯录查询的结果,使用CursorLoader来管理通讯录Provider的查询。app若需要访问通讯录,你需要在mainfest里添加权限READ_CONTACTS。

// old cursor once we return.)

mAdapter.swapCursor(data);

     }

 

     public void onLoaderReset(Loader loader) {

// This is called when the last Cursor provided to onLoadFinished()

// above is about to be closed.  We need to make sure we are no

// longer using it.

mAdapter.swapCursor(null);

     }

 }

Android编程权威指南的目录

第1章 Android应用初体验 1  1.1  应用基础 2  1.2  创建Android项目 2  1.3  Eclipse工作区导航 5  1.4  用户界面设计 6  1.4.1  视图层级结构 9  1.4.2  组件属性 10  1.4.3  创建字符串资源 11  1.4.4  预览界面布局 12  1.5  从布局XML到视图对象 13  1.6  组件的实际应用 15  1.6.1  类包组织导入 16  1.6.2  引用组件 16  1.6.3  设置监听器 17  1.7  使散岁明用模拟器运行应用 21  1.8  Android编译过程 22  第2章 Android与MVC设计模式 26  2.1  创建新类 26  2.2  Android与MVC设计模式 30  2.3  更新视图层 31  2.4  更新控制层 33  2.5  在设备上运行应用 37  2.5.1  连接设备 37  2.5.2  配置设备用于应用开发 38  2.6  添加图标资源 38  2.6.1  向项目中添加资源 39  2.6.2  在XML文件中引用资源 40  2.7  关于挑战练习 41  2.8  挑战练习一:为TextView添加监听器 41  2.9  挑战练习二:添加后退按钮 42  2.10  挑战练习三:从按钮到图标按钮 42  第3章 Activity的生命周期 45  3.1  日志跟踪理解Activity生命周期 46  3.1.1  输出日志信息 46  3.1.2  使用 LogCat 48  3.2  设备旋转与Activity生命周期 52  3.3  设备旋转前保存数据 56  3.4  再探Activity生命周期 57  3.5  深入学习:测试onSaveInstanceState-(Bundle)方法 59  3.6  深入学习:日志记录的级别与方法 60  第4章 Android应用的调试 62  4.1  冲告DDMS应用调试透视图 63  4.2  异常与栈跟踪 64  4.2.1  诊断应用异常 65  4.2.2  记录栈跟踪日志 66  4.2.3  设置断点 68  4.2.4  使用异常断点 71  4.3  文件浏览器 72  4.4  Android特有的调试工具 73  4.4.1  使用Android Lint 73  4.4.2  R类的问题 74  第5章 第二个activity 75  5.1  创建第二个activity 76  5.1.1  创建新布局 77  5.1.2  创建新的activity子类 80  5.1.3  在manifest配置文件中声明activity 81  5.1.4  为QuizActivity添加cheat按钮 82  5.2  启动activity 83  5.3  activity间的数据传递 85  5.3.1  使用intent extra 86  5.3.2  从子activity获取返回结果 88  5.4  activity的使用与管理 92  5.5  挑战练习 95  第6章 Android SDK版本与兼容 96  6.1  Android SDK版本 96  6.2  Android编程与兼容性问题 97  6.2.1  全新的系统版本——Honeycomb 97  6.2.2  SDK更低版本 99  6.2.3  SDK目标版本 99  6.2.4  雀滚SDK编译版本 99  6.2.5  安全添加新版本API中的代码.3  使用Android开发者文档.4  挑战练习:报告编译版本 105  第7章 UI fragment与fragment 管理器.1  UI设计的灵活性需求.2  fragment的引入.3  着手开发CriminalIntent.3.1  创建新项目.3.2  fragment与支持库.3.3  创建Crime类.4  托管UI fragment.4.1  fragment的生命周期.4.2  托管的两种方式.4.3  定义容器视图.5  创建UI fragment.5.1  定义CrimeFragment的布局.5.2  创建CrimeFragment类.6  添加UI fragment到FragmentManager.6.1  fragment事务.6.2  FragmentManager与fragment生命周期.7  activity使用fragment的理由.8  深入学习:Honeycomb、ICS、Jelly Bean以及更高版本系统上的应用开发 127  第8章 使用布局与组件创建用户界面.1  升级Crime类.2  更新布局.3  生成并使用组件.4  深入探讨XML布局属性.4.1  样式、主题及主题属性.4.2  dp、sp以及屏幕像素密度.4.3  Android开发设计原则.4.4  布局参数.4.5  边距与内边距.5  使用图形布局工具.5.1  添加新组件.5.2  属性视图中编辑组件属性.5.3  在框架视图中重新组织组件.5.4  更新子组件的布局参数.5.5 android:layout_weight属性的工作原理.5.6  图形布局工具使用总结.5.7  组件ID与多种布局.6  挑战练习:日期格式化 143  第9章 使用ListFragment显示列表.1  更新CriminalIntent应用的模型层.2  创建ListFragment.3  使用抽象activity托管fragment.3.1  通用的fragment托管布局.3.2  抽象activity类.4  ListFragment、ListView及ArrayAdapter.4.1  创建ArrayAdapter类实例.4.2  响应列表项的点击事件.5  定制列表项.5.1  创建列表项布局.5.2  创建adapter子类 162  第10章 使用fragment argument.1  从fragment中启动activity.1.1  附加extra信息.1.2  获取extra信息.1.3  使用Crime数据更新CrimeFragment视图.1.4  直接获取extra信息方式的缺点.2  fragment argument.2.1  附加argument给fragment.2.2  获取argument.3  重新加载显示列表项.4  通过fragment获取返回结果 172  第11章 使用ViewPager.1  创建CrimePagerActivity.1.1  以代码的方式定义并产生布局.1.2  ViewPager与Pager-Adapter.1.3  整合配置并使用CrimePagerActivity.1.4  FragmentStatePager-Adapter与Fragment-PagerAdapter.2  深入学习:ViewPager的工作原理 182  第12章 对话框.1  创建DialogFragment.1.1  显示DialogFragment.1.2  设置对话框的显示内容.2  fragment间的数据传递.2.1  传递数据给DatePicker-Fragment.2.2  返回数据给CrimeFragment.3  挑战练习:更多对话框 198  第13章 使用MediaPlayer播放音频.1  添加资源.2  定义HelloMoonFragment布局文件.3  创建HelloMoonFragment.4  使用布局fragment.5  音频播放.6  挑战练习:暂停音频播放.7  深入学习:播放视频.8  挑战练习:在HelloMoon应用中播放视频 208  第14章 fragment的保留.1  保留fragment实例.2  设备旋转与保留的fragment.3  保留的fragment:一切都完美了吗.4  设备旋转处理与onSaveInstance-State(Bundle)方法.5  深入学习:fragment引入前的设备旋转问题 214  第15章 应用本地化.1  本地化资源.2  配置修饰符.2.1  可用资源优先级排定.2.2  多重配置修饰符.2.3  寻找最匹配的资源.3  更多资源使用原则及控制.3.1  资源命名.3.2  资源目录结构.4  测试备选资源 221  第16章 操作栏.1  选项菜单.1.1  在XML文件中定义选项菜单.1.2  创建选项菜单.1.3  响应菜单项选择.2  实现层级式导航.2.1  启用应用图标的导航功能.2.2  响应向上按钮.3  可选菜单项.3.1  创建可选菜单XML文件.3.2  切换菜单项标题.3.3  “还有个问题”.4  挑战练习:用于列表的空视图 239  第17章 存储与加载本地文件.1  CriminalIntent应用的数据存取.1.1  保存crime数据到ON文件.1.2  从文件中读取crime数据.2  挑战练习:使用外部存储.3  深入学习:Android文件系统与Java I/O 248  第18章 上下文菜单与上下文操作模式.1  定义上下文菜单资源.2  实施浮动上下文菜单.2.1  创建上下文菜单.2.2  为上下文菜单登记视图.2.3  响应菜单项选择.3  实施上下文操作模式.3.1  实现列表视图的多选操作.3.2  列表视图中的操作模式回调方法.3.3  改变已激活视图的显示背景.3.4  实现其他视图的上下文操作模式.4  兼容性问题:回退还是复制.5  挑战练习:在CrimeFragment视图中删除crime记录.6  深入学习:ActionBarSherlock.7  挑战练习:使用ActionBarSherlock.7.1  CriminalIntent应用中ABS的基本整合.7.2  ABS的深度整合.7.3  ABS的完全整合 265  第19章 相机I:取景器.1  创建Fragment布局.2  创建CrimeCameraFragment.3  创建CrimeCameraActivity.4  使用相机API.4.1  打开并释放相机.4.2  SurfaceView、Surface-Holder与Surface.4.3  确定预览界面大小.4.4  启动CrimeCamera-Activity.5  深入学习:以命令行的方式运行activity 281  第20章 相机 II:拍摄并处理照片.1  拍摄照片.1.1  实现相机回调方法.1.2  设置图片尺寸大小.2  返回数据给CrimeFragment.2.1  以接收返回值的方式启动CrimeCameraActivity.2.2  在CrimeCameraFragment中设置返回值.2.3  在CrimeFragment中获取照片文件名.3  更新模型层.3.1  新增Photo类.3.2  为Crime添加photo属性.3.3  设置photo属性.4  更新CrimeFragment的视图.4.1  添加ImageView组件.4.2  图像处理.5  在DialogFragment中显示大图片.6  挑战练习:Crime照片的显示方向.7  挑战练习:删除照片.8  深入学习:Android代码的废弃处理 303  第21章 隐式intent.1  添加按钮组件.2  添加嫌疑人信息至模型层.3  使用格式化字符串.4  使用隐式intent.4.1  典型隐式intent的组成.4.2  发送陋习报告.4.3  获取联系人信息.4.4  检查可以响应的activity.5  挑战练习:又一个隐式intent 317  第22章 Master-Detail用户界面.1  增加布局灵活性.1.1  修改SingleFragment-Activity.1.2  创建包含两个fragment容器的布局.1.3  使用别名资源.2  Activity:fragment的托管者.3  深入学习:设备屏幕尺寸的确定 331  第23章 深入学习intent和任务.1  创建NerdLauncher项目.2  解析隐式intent.3  在运行时创建显式intent.4  任务与后退栈.5  使用NerdLauncher应用作为设备主屏幕.6  挑战练习:应用图标与任务重排.7  进程与任务 341  第24章 样式与include标签的使用.1  创建RemoteControl项目.1.1  编码实现RemoteControl-Activity.1.2  创建RemoteControl-Fragment.2  使用样式消除重复代码.3  完善布局定义.4  深入学习:使用include与merge标签.5  挑战练习:样式的继承 354  第25章 XML Drawable与9-Patches.1  XML drawable.2  state list drawable.3  layer list与inset drawable.4  使用9-patch图像 362  第26章 HTTP与后台任务.1  创建PhotoGallery应用.2  网络连接基本.3  使用AsyncTask在后台线程上运行代码.4  线程与主线程.5  获取Flickr XML数据.6  从AsyncTask回到主线程.7  深入学习:再探AsyncTask.8  挑战练习:分页 386  第27章 Looper、Handler与HandlerThread.1  设置GridView以显示图片.2  批量下载缩略图.3  与主线程通信.4  创建并启动后台线程.5  Message与message Handler.5.1  消息的剖析.5.2  Handler的剖析.5.3  使用handler.5.4  传递handler.6  深入学习:AsyncTask与Thread.7  挑战练习:预加载以及缓存 401  第28章 搜索.1  搜索Flickr网站.2  搜索对话框.2.1  创建搜索界面.2.2  可搜索的activity.2.3  物理搜索键.2.4  搜索的工作原理.2.5  启动模式与新的intent.2.6  使用shared preferences实现轻量级数据存储.3  在Android 3.0以后版本的设备上使用SearchView.4  挑战练习 416  第29章 后台服务.1  创建IntentService.2  服务的作用.3  查找最新返回结果.4  使用AlarmManager延迟运行服务.4.1  PendingIntent.4.2  使用PendingIntent管理定时器.5  控制定时器.6  通知信息.7  深入学习:服务细节内容.7.1  服务的能与不能.7.2  服务的生命周期.7.3  non-sticky服务.7.4  sticky服务.7.5  绑定服务 431  第30章 broadcast Intent.1  随设备重启而重启的定时器.1.1  配置文件中的broadcast receiver.1.2  如何使用receiver.2  过滤前台通知消息.2.1  发送broadcast intent.2.2  动态broadcast receiver.2.3  使用私有权限.2.4  使用ordered broadcast接收结果.3  receiver与长时运行任务 446  第31章 网页浏览.1  最后一段Flickr数据.2  简单方式:使用隐式intent.3  较难方式:使用WebView.3.1  使用WebChromeClient优化WebView的显示.3.2  处理WebView的设备旋转问题.4  深入学习:注入JavaScript对象 456  第32章 定制视图与触摸事件.1  创建DragAndDraw项目.1.1  创建DragAndDraw-Activity.1.2  创建DragAndDraw-Fragment.2  创建定制视图.3  处理触摸事件.4  onDraw(…)方法内的图形绘制.5  挑战练习:设备旋转问题 467  第33章 跟踪设备的地理位置.1  启动RunTracker项目.1.1  创建RunActivity.1.2  创建RunFragment.2  地理位置与LocationManager.3  接收定位数据更新broadcast.4  使用定位数据刷新UI显示.5  快速定位:最近一次地理位置.6  在物理和虚拟设备上测试地理位置定位 480  第34章 使用SQLite本地数据库.1  在数据库中存储旅程和地理位置信息.2  查询数据库中的旅程列表.3  使用CursorAdapter显示旅程列表.4  创建新旅程.5  管理现有旅程.6  挑战练习:识别当前跟踪的旅程 500  第35章 使用Loader加载异步数据.1  Loader与LoaderManager.2  在RunTracker应用中使用Loader.3  加载旅程列表.4  加载单个旅程.5  加载旅程的最近一次地理位置 509  第36章 使用地图.1  添加Maps API给RunTracker应用.1.1  使用物理设备测试地图.1.2  安装使用Google Play services SDK.1.3  获取Google Maps API key.1.4  更新RunTracker应用的manifest配置文件.2  在地图上显示用户的地理位置.3  显示旅程路线.4  为旅程添加开始和结束地图标注.5  挑战练习:实时数据更新 521  第37章 编后语.1  终极挑战.2  关于我们.3  致谢 523

loadermanager异步加载数据库的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于loadermanager异步加载数据库,LoaderManager完成异步数据库加载,android学习需要什么条件和基础?android开发需要花多长时间才能入职?,android loaders 什么时候使用,Android编程权威指南的目录的信息别忘了在本站进行查找喔。


数据运维技术 » LoaderManager完成异步数据库加载 (loadermanager异步加载数据库)