Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用

 

在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对象的创建有所不同之外,其余步骤都相同!

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值