Loaders简介,
loader提供了一套在UI主线程中异步加载数据的框架。使用Loader可以非常简单的在Activity或在Fragment中异步加载数据,一般用户大量的数据查询,或者需要经常修改并将数据及时地展示在UI上,这样可以避免数据查询时造程UI主线成卡顿。
Loader有以下特点:
1.在Activity或者在Fragment中适合用。
2.可以提供异步加载数据的方式。
3.监听数据,当数据改变的时候,将新的数据发布到UI上。
4.Loader使用Cursor加载数据,在更改Cursor数据的时候,会自动连接到最后配置的Cursor中读取数据,因此不需要重新查询数据。
LoaderManager简介,
LoaderManager,装载机管理器,用于在Activity或者在Fragment中管理一个或多个Loader实例。在Activity或者在Fragment中可以通过getLoaderManager获取LoaderManager对象,它是以一种单例获得LoaderManager对象的。所以每个Activity或者Fragment中只有一个LoaderMnager,一个LoaderManager可以有多个Loader。
这里介绍LoaderManager提供的几个方法,用于管理Loader。
public Loader<Cursor> onCreateLoader(int id, Bundle args)
根据指定的ID,初始化一个新的Loader。
onLoadFinished(Loader loader, Cursor cursor)
当Loader加载完毕后调用,在其中处理Loader获取的Cursor数据。
1,建立一个activity,或者Fragment。在一个应用程序中用Loader有以下步骤:
2,获得一个LoaderManager实例。
3,通过调用LoaderManager的initLoader的方法实例化一个Loader。
4,实现匿名接口LoaderManager.LoaderCallbacks
.
下面是一个实例的部分代码:
1 public class MainActivity extends Activity { 2 3 private LoaderManager manager; 4 private ListView listView; 5 MyAdapter adapter = null; 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 listView = (ListView) findViewById(R.id.listview); 11 manager = getLoaderManager();//加载LoaderManager完成异步加载数据的操作 (1) 12 manager.initLoader(1000, null, callbacks ); //(2)实例化一个Loader 13 registerForContextMenu(listView); 14 } 15 16 @Override 17 public void onCreateContextMenu(ContextMenu menu, View v, 18 ContextMenuInfo menuInfo) { 19 // TODO 自动生成的方法存根 20 super.onCreateContextMenu(menu, v, menuInfo); 21 getMenuInflater().inflate(R.menu.main, menu); 22 } 23 24 public Dialog createDialog(Context context){ 25 Dialog dialog = new Dialog(context); 26 dialog.setContentView(R.layout.add); 27 return dialog; 28 } 29 30 public boolean onContextItemSelected(MenuItem item) { 31 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 32 switch (item.getItemId()) { 33 case R.id.add: 34 //添加自定义对话框,完成对数据的入录 35 final Dialog dialog = createDialog(MainActivity.this); 36 Button button = (Button) dialog.findViewById(R.id.button1); 37 button.setOnClickListener(new OnClickListener() { 38 39 @Override 40 public void onClick(View v) { 41 // TODO 自动生成的方法存根 42 EditText editText = (EditText) dialog.findViewById(R.id.editText1); 43 String name = editText.getText().toString().trim(); 44 ContentResolver resolver = MainActivity.this.getContentResolver(); 45 Uri url = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student"); 46 ContentValues values = new ContentValues(); 47 values.put("name", name); 48 Uri uri = resolver.insert(url, values); 49 if(null != uri) 50 manager.restartLoader(1000, null, callbacks); 51 dialog.dismiss(); 52 } 53 }); 54 dialog.show(); 55 return true; 56 case R.id.delete: 57 if(adapter == null) 58 return false; 59 int position = info.position; 60 String name = adapter.getItem(position).toString(); 61 ContentResolver resolver = MainActivity.this.getContentResolver(); 62 Uri url = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student"); 63 String where = "name=?"; 64 String[] selectionArgs = {name}; 65 int count = resolver.delete(url, where, selectionArgs); 66 if(count > 0){ 67 manager.restartLoader(1000, null, callbacks); 68 } 69 return true; 70 71 } 72 return false; 73 } 74 75 @Override 76 public boolean onCreateOptionsMenu(Menu menu) { 77 // Inflate the menu; this adds items to the action bar if it is present. 78 getMenuInflater().inflate(R.menu.main, menu); 79 return true; 80 } 81 private LoaderCallbackscallbacks = new LoaderCallbacks () { //(3) 82 83 @Override 84 public void onLoaderReset(Loader loader) { 85 // TODO 自动生成的方法存根 86 87 } 88 //完成对Ui数据的提取,更新UI操作 89 @Override 90 public void onLoadFinished(Loader loader, Cursor cursor) { 91 // TODO 自动生成的方法存根 92 //把数据提取出来,放到适配器中完成对UI的更新. 93 List list = new ArrayList (); 94 while(cursor.moveToNext()){ 95 String name = cursor.getString(cursor.getColumnIndex("name")); 96 list.add(name); 97 } 98 adapter = new MyAdapter(MainActivity.this); 99 adapter.setList(list); 100 listView.setAdapter(adapter); 101 adapter.notifyDataSetChanged(); 102 } 103 104 @Override 105 public Loader onCreateLoader(int id, Bundle args) { 106 // TODO 自动生成的方法存根 107 //使用new 一个CursorLoader的实例,从ContentProvider里提取数据放在loader中的Cursor里面,并返回loader 108 Uri uri = Uri.parse("content://com.example.android_loader_manager.StudentContentProvider/student"); 109 CursorLoader loader = new CursorLoader(MainActivity.this, uri, null, null, null, null); 110 111 return loader; 112 } 113 }; 114 115 private class MyAdapter extends BaseAdapter{ 116 117 private List list; 118 private Context context; 119 public MyAdapter(Context context) { 120 121 this.context = context; 122 } 123 public void setList(List list){ 124 this.list = list; 125 } 126 @Override 127 public int getCount() { 128 // TODO 自动生成的方法存根 129 return list.size(); 130 } 131 132 @Override 133 public Object getItem(int position) { 134 // TODO 自动生成的方法存根 135 return list.get(position); 136 } 137 138 @Override 139 public long getItemId(int position) { 140 // TODO 自动生成的方法存根 141 return position; 142 } 143 144 @Override 145 public View getView(int position, View convertView, ViewGroup parent) { 146 // TODO 自动生成的方法存根 147 TextView view = null; 148 if(convertView == null) 149 view = new TextView(context); 150 else 151 view = (TextView)convertView; 152 view.setText(list.get(position).toString()); 153 return view; 154 } 155 } 156 157 158 }