之前经常看些大牛的博客, 从中受益良多,也帮我解决了很多问题, 一直想自己开一个博客, 于是就有了这第一篇文章, 嘿嘿, 初次写博客, 写的不好的地方大家见谅哈,如有不足或错误的地方,欢迎指出。 废话不多说, 进入正题:
在Android 3.0 API中引入了Loader加载器, 它主要作用就是用于异步加载数据,当数据源改变时可以实时刷新(可以直接理解为Observer模式),本章主要讲的是Loader的孙子(CursorLoader)的基本使用(因为它简单)
在Android 3.0 API中引入了Loader加载器, 它主要作用就是用于异步加载数据,当数据源改变时可以实时刷新(可以直接理解为Observer模式),本章主要讲的是Loader的孙子(CursorLoader)的基本使用(因为它简单)
CursorLoader顾名思义, 主要是用于加载Povider提供的数据,上代码, 代码中注释应该还算详细:
package com.ljj.loaderdata; import android.database.Cursor; import android.net.Uri; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> { private ListView dataList; private LoaderManager mManager; private SimpleCursorAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mManager = getSupportLoaderManager(); // 偷懒, 直接使用系统自带的item布局 mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, new String[]{"number"}, new int[]{android.R.id.text1}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); initView(); mManager.initLoader( 1, // 加载器的标识, 如果不存在此加载器, 则会触发onCreateLoader创建, 如果存在则复用 null, // 可选的参数, 用于加载器初始化时 this); } private void initView() { dataList = (ListView) findViewById(R.id.data_list); dataList.setAdapter(mAdapter); } // 创建并返回一个新的loader(当指定的loader id不存在时才会调用) /** * * @param id 指定的加载器的id * @param args 初始化时传入的参数 * @return */ @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(MainActivity.this, Uri .parse("content://call_log/calls"), new String[] { "_id", "number" }, null, null, null); } // 当加载器完成了他的装载过程后被调用 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 将加载成功的数据替换到adapter中显示, (类似于notifyDataSetChanged()) mAdapter.swapCursor(data); } /** * 当Loader被重置(比如查询其他字段)从而使之前的数据无效时, 调用此方法清除上一次的数据, * 当数据被清除之后, GC才可以清除数据 */ @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }