您的位置:首页 > 移动开发 > Android开发

Android异步加载数据--Loader

2016-09-13 20:22 369 查看
一, 什么是Loader
    Loader 是android 3.0后出现, 它可以使Activity和Fragment异步加载数据变得简单

二,  Loader的主要的作用  

   他对每个Activity和Fragment都是有效的

    他通过异步的方式加载数据

    他有一个系统感知的机制, 当数据源发生变化时, 会及时通知.也就是说可以监听数据源的变化, 一旦数据源发生变化后, Loader就会感知到这些变化

    实时刷新数据, 当Cursor中数据发生变化时, ListView自动刷新
  三, loader使用的核心类

    LoaderManager

       作用: 

        1, 初始化启动Loader,  无条件

            initLoader(编号, 查询条件, 回调接口)

        2, 重启Loader, 有条件

            restartLoader(编号, 查询条件, 回调接口)

       注意:

        1, 一个Activity和Fragment中只能有一个LoaderManager, 而一个LoaderManager可以管理多个Loader

        2, 在启动Loader时, 必须要提供一个回调接口, 即LoaderCallBacks接口

    LoaderCallBacks  回调接口

        重写3个方法

        1, 创建新的Loader的方法

            onCreateLoader(int id,Bundle args)

            {

                return  new CursorLoader(...);

            }

        2, Loader加载数据完成

            onLoaderFinished(Loader<Cursor> loader, Cursor data)

            {

                //adapter.swapCursor(data);

                adapter.changeCursor(data);// 多了一个关闭Cursor的操作

            }

        3, 在创建新的Loader之前, 重置之前Loader加载的数据

            onLoaderReset(Loader<Cursor> loader)

            {

            

                //adapter.swapCursor(null);

                adapter.changeCursor(null);// 多了一个关闭Cursor的操作

            }

    CursorLoader

        CursorLoader 内部使用了CotentResolver 加载ContentProvider暴露出来的数据,通过URI

        内置CotentObserver,监听数据源的变化

 AsyncTaskLoader<D>   自定义的Loader

        1, 定义一个类, 继承AsyncTaskLoader<D> ,声明返回结果的类型

        2, 重写方法 onStartLoading()  , 执行方法: forceLoader()强制执行后台的方法, 加载数据

        3, 重写父类的方法 loadInBackground() , 在此方法中执行获取数据的操作, 并将结果返回
        4, 构造方法

查询联系人实例:

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
private ListView lv;
private EditText edit;
private Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private String[] columns = { ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER };
private SimpleCursorAdapter adapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
edit = (EditText) findViewById(R.id.edit);
edit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO
Bundle b = new Bundle();
b.putString("key", s.toString());
getLoaderManager().restartLoader(1, b, MainActivity.this);
}
});
getLoaderManager().initLoader(1, null, this);

adapter = new SimpleCursorAdapter(this, R.layout.item, null,
new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER },
new int[] { R.id.textView1, R.id.textView2 },
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO 创建新的loader 加载相应的数据
// 创建一个对象 加载数据 并且返回
// CursorLoader loader = new CursorLoader(this, uri,
// columns, null, null,
// null);
String selection = null;
String[] selectionArgs = null;
if (args != null) {
selection = ContactsContract.CommonDataKinds.Phone.NUMBER
+ " like ? ";
selectionArgs = new String[] { "%" + args.getString("key") + "%" };
}
CursorLoader loader = new CursorLoader(this, uri, columns, selection,
selectionArgs, null);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Loader数据加载结束
adapter.changeCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub
// 清除旧数据
adapter.changeCursor(null);
}
}


自定义实例:

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
private ListView lv;
private SearchView sc;
private SimpleCursorAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

lv = (ListView) findViewById(R.id.lv);
sc = (SearchView) findViewById(R.id.sc);

adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.lvitem,
null, new String[] { "uname", "upwd" }, new int[] { R.id.name,
R.id.pwd },
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

lv.setAdapter(adapter);
// 初始化启动Loader
getLoaderManager().initLoader(1, null, this);

sc.setOnQueryTextListener(new OnQueryTextListener() {

@Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub

Bundle args = new Bundle();
args.putString("key", newText);
getLoaderManager().restartLoader(1, args, MainActivity.this);
return false;
}
});
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
MyLoad myLoad = new MyLoad(MainActivity.this, args);
return myLoad;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Auto-generated method stub
adapter.changeCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub
adapter.changeCursor(null);
}

}

public class MyLoad extends AsyncTaskLoader<Cursor> {

private Bundle bundle;
private Uri uri =  Uri.parse("content://应用程序的包名.数据库名/表名(一般自定义)");
private String selection;
private String[] selectionArgs;
private String[] columns = {"_id","uname","upwd"};
public MyLoad(Context context,Bundle bundle) {
super(context);
this.bundle = bundle;
}

public MyLoad(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

@Override
protected void onStartLoading() {
// TODO Auto-generated method stub
super.onStartLoading();
forceLoad();
}

@Override
public Cursor loadInBackground() {
// TODO Auto-generated method stub
if(bundle != null){
selection = "uname like ?";
selectionArgs = new String[] {"%"+bundle.getString("key")+"%"};
}
Cursor cursor = getContext().getContentResolver().query(uri,
columns, selection, selectionArgs, null);

return cursor;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: