<pre name="code" class="java">AsyncTaskLoader<span style="font-family: Arial, Helvetica, sans-serif;">提供了一个基于AsyncTask 工作机制的Loader,查看源码可以看到其继承于Loader,并且子类LoadTask 继承于AsyncTask<Void, Void, D>,并且实现了Runable 接口,功能十分强大。本DEMO就是基于AsyncTaskLoader篇写。</span>
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
private ListView listview;
private TextView tvEmpty;
private SimpleCursorAdapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.lv_display);
tvEmpty = (TextView) findViewById(R.id.tv_empty);
LoaderManager manager=getLoaderManager();
adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.activity_item, null, new String[]{"display_name"}, new int[]{R.id.tv_name},SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listview.setAdapter(adapter);
listview.setEmptyView(tvEmpty);
manager.initLoader(1, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
/*CursorLoader loader = new CursorLoader(getApplicationContext(),ContactsContract.RawContacts.CONTENT_URI, null, null, null, null);
return loader;*/
MyLoader loader = new MyLoader(getApplicationContext());
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
static class MyLoader extends AsyncTaskLoader<Cursor>{
private static final String TAG = "MyLoader";
private Context context;
public MyLoader(Context context) {
super(context);
this.context=context;
}
@Override
protected void onStartLoading() {
super.onStartLoading();
Log.i(TAG, "onStartLoading---------->curren Thread="+Thread.currentThread().getId());
forceLoad();
}
/**
* 运行在WorkThread(子线程)
*/
@Override
public Cursor loadInBackground() {
Cursor cursor=context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null);
Log.i(TAG, "loadInBackground---------->curren Thread="+Thread.currentThread().getId());
return cursor;
}
@Override
public void deliverResult(Cursor data) {
super.deliverResult(data);
Log.i(TAG, "deliverResult---------->curren Thread="+Thread.currentThread().getId());
}
}
}