概述
在Android3.0中,引入了LoaderManager的用法,可以对数据进行异步查询、载入、及时刷新,相比在UI线程中进行此类操作,大大提高了CPU的运行效率与反应时间;
LoaderManager的使用有两种方式,一种是继承AsyncTaskLoader,另一种是使用CursorLoader。
AsyncTaskLoader的使用:
首先,应该得到LoaderManager:manager=getLoaderManager();
其次,创建并启动Loader:manager.initLoader(int id, Bundle args, LoaderCallbacks<D> callback),第一个参数表示Loader标识,第二个参数表示传给Loader的Bundle对象,当不传入指时,可
传入null,第三个参数表示LoaderCallback接口,LoaderManager回调此接口进行各种操作;
实现LoaderCallback接口,有三个方法需要重写:
onCreateLoader():manager.init()之后,通过传入的id标识判断,如果存在该Loader,则不再调用,若不存在,则创建新的Loader——该方法返回一个AsyncTask即可;
onLoadFinished():后台异步操作完成后调用,它会返回新的cursor对象,在这个方法中交换adapter的cursor即可:adapter.swapCursor(data);
onLoaderReset():重置Loader,把返回的cursor对象置空即可:adapter.swapCursor(null);
在上面说到,要返回一个AsyncTaskLoader对象,而进行操作的正是这个对象,一般写个静态内部类,继承AsyncTaskLoader,并重写三个方法,注意,这里必须是静态的内部类,三个方法如下:
onStartLoading():开始执行异步查询之前调用,因此在这里通知loader对象强行进行加载:forceLoad();
loadInBackground():在后台进行各种异步操作;
deliverResult():执行完loadInBackground之后回调的方法,并且接收loadInBackground返回的Cursor;
例:创建一个数据库,并且对数据库进行查询操作:
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
private ListView listView;
private SimpleCursorAdapter adapter;
private TextView textView;
private MyDbHelper helper;
private static SQLiteDatabase database;
private LoaderManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建数据库
createDatabase();
//初始化布局
initView();
}
@Override
protected void onResume() {
super.onResume();
//使用LoaderManager加载数据
useLoader();
}
private void useLoader() {
//获取LoaderManager
manager=getLoaderManager();
manager.initLoader(1, null, this);
}
private void createDatabase() {
helper=new MyDbHelper(this, "nba.db", null, 4);
database=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name", "科比");
values.put("team", "湖人");
values.put("age", 24);
database.insert("nba", null, values);
values.put("name", "库里");
values.put("team", "勇士");
values.put("age", 30);
database.insert("nba", null, values);
values.put("name", "乔丹");
values.put("team", "公牛");
values.put("age", 23);
database.insert("nba", null, values);
values.put("name", "詹姆斯");
values.put("team", "骑士");
values.put("age", 23);
database.insert("nba", null, values);
values.put("name", "韦德");
values.put("team", "热火");
values.put("age", 3);
database.insert("nba", null, values);
values.put("name", "艾弗森");
values.put("team", "76人");
values.put("age", 3);
database.insert("nba", null, values);
values.put("name", "保罗");
values.put("team", "快船");
values.put("age", 3);
database.insert("nba", null, values);
}
private void initView() {
listView=(ListView) findViewById(R.id.listView);
textView=(TextView) findViewById(R.id.textView);
listView.setEmptyView(textView);
adapter=new SimpleCursorAdapter(this, R.layout.adapter, null, new String[]{"name","team","age"},
new int[]{R.id.textView_name,R.id.textView_team,R.id.textView_age});
listView.setAdapter(adapter);
}
/**
* 创建Loader对象,当该Loader对象存在时,不再调用此方法
*/
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
return new MyAsyncTaskLoader(MainActivity.this);
}
/**
* 查询完成后执行,返回cursor对象
*/
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
//和旧的cursor对象互换
adapter.swapCursor(data);
}
/**
* 重置Loader
*/
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//将cursor置空
adapter.swapCursor(null);
}
/**
* 创建静态内部类,继承AsyncTaskLoader,并重写三个方法
*
*/
static class MyAsyncTaskLoader extends AsyncTaskLoader<Cursor>{
public MyAsyncTaskLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/**
* 调用loadInBackground之前调用
*/
@Override
protected void onStartLoading() {
// TODO Auto-generated method stub
super.onStartLoading();
//强制执行后台异步加载
forceLoad();
}
/**
* 在后台进行异步查询
*/
@Override
public Cursor loadInBackground() {
// TODO Auto-generated method stub
Cursor cursor=database.query("nba", null, null, null, null, null, null);
return cursor;
}
/**
* 执行完loadInBackground之后调用,对cursor进行回收
*/
@Override
public void deliverResult(Cursor data) {
// TODO Auto-generated method stub
super.deliverResult(data);
}
}
}
数据库的创建:
public class MyDbHelper extends SQLiteOpenHelper {
public MyDbHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
private static final String CREATE_TABLE="create table nba(" +
"_id integer primary key autoincrement," +
"name txt," +
"team txt," +
"age integer)";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
if(oldVersion<newVersion){
db.execSQL("drop table if exists nba");
onCreate(db);
}
}
}
运行效果:
CursorLoader的使用:
Loadermanager的第二种用法,就是用CursorLoader进行查询。相比于AsyncTaskLoader,CursorLoader更加简便一点,它不需要像AsyncTaskLoader一样,需要自定义类继承AsyncTaskLoader,而是直接返回CursorLoader对象即可,与AsyncTaskLoader的区别就是,AsyncTaskLoader适合于进行数据库操作,而CursorLoader适合于用进行ContentResolver操作。
使用CursorLoader时,其他步骤与AsyncTaskLoader一样,在调用manager.init()后,在回调方法onCreateLoader()中,返回CursorLoader对象即可,从而不需要自定义;
CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
从构造方法可以看出,第二个参数需要传入Uri对象;如短信查询:uri=Uri.parse("content://sms");
除loader对象的创建有所不同之外,其余步骤都相同!
最后
以上就是沉默煎蛋为你收集整理的Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用的全部内容,希望文章能够帮你解决Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复