Android第十七天 Loader异步装载

AsyncTaskLoader的使用步骤:

 

1.让主Activity实现LoaderCallbacks<Cursor>接口

2.构建一个LoaderManager()

manager=getLoaderManager()

3.实现一个Loader,并初始化

manager.initLoader(id,Bundle,LoaderCallbacks);

4.构建SimpleCursorAdapter,传递一个空的数据源

5.绑定数据源

6.一个类继承AsyncTaskLoader<Cursor>


在menu配置文件中配置SearchView

      android:showAsAction="always"

     android:actionViewClass="android.widget.SearchView"

示例代码:

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {

         private ListView listView_main_info;

         private TextView textView_empty;

         private SimpleCursorAdapter adapter;

         private LoaderManager manager;

         private final static String TAG = "MainActivity";

 

         @Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

 

                   listView_main_info = (ListView) findViewById(R.id.listView_main_info);

                   textView_empty = (TextView) findViewById(R.id.textView_empty);

 

                   // 1. 构建一个LoaderManager

                   manager = getLoaderManager();

 

                   // 2. 实现一个Loader,并初始化Loader

                   /**

                    * @param1:Loader的唯一标识id

                    * @param2:Bundle 用来传递给Loader的数据

                    * @param3:LoaderCallbacks的回调接口

                    */

                   manager.initLoader(1, null, this);

 

                   // 3. 实现LoaderManager.LoaderCallbacks

 

                   // 4. 构建SimpleCursorAdapter,先传递一个空值

         //参数说明: 1:布局,2:数据源,3:列名,4:控件ID

                   adapter = new SimpleCursorAdapter(this,

                                     android.R.layout.simple_list_item_2, null, new String[] {

                                                        "address", "body" }, new int[] { android.R.id.text1,

                                                        android.R.id.text2 }, 1);

 

                   // 5. 绑定

                   listView_main_info.setAdapter(adapter);

                   listView_main_info.setEmptyView(textView_empty);

         }

 

         // Menu ActionBar

         @Override

         /**

          * 如果id不存在,则会触发onCreateLoader方法,在这个方法中需要去创建一个Loader,并返回

          */

         public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {

                   Log.i(TAG, "--------onCreateLoader-------->>"

                                     + Thread.currentThread().getId() + ":"

                                     + Thread.currentThread().getName());

                   // 创建一个Loader,并返回

                   return new MyLoader(this, bundle);

         }

 

         @Override

         /**

          * 当先前被创建的Loader完成数据加载的时候,会触发这个方法的调用

          */

         public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

                   Log.i(TAG, "--------onLoadFinished-------->>"

                                     + Thread.currentThread().getId() + ":"

                                     + Thread.currentThread().getName());

                   // 交换Cursor,内部而且会去帮我们关闭老的Cursor,

                   adapter.swapCursor(data);

         }

        

         @Override

         /**

          *当先前被创建的Loader被复位的时候,会触发这个方法的调用

          */

         public void onLoaderReset(Loader<Cursor> loader) {

                  adapter.swapCursor(null);

         }

        

         @Override

         public boolean onCreateOptionsMenu(Menu menu) {

                   getMenuInflater().inflate(R.menu.main, menu);

 

                   SearchView searchView = (SearchView) menu.findItem(R.id.action_search)

                                     .getActionView();

 

                   searchView.setOnQueryTextListener(new OnQueryTextListener() {

 

                            @Override

                            public boolean onQueryTextSubmit(String query) {

                                     // TODO Auto-generated method stub

                                     return false;

                            }

                           

                            @Override

                            public boolean onQueryTextChange(String newText) {

                                    

                                     Bundle bundle = new Bundle();

                                     bundle.putString("KEY", newText);

                                     // 再次调用OnCreate方法

                                     manager.restartLoader(1, bundle, MainActivity.this);

                                     return false;

                            }

                   });

                   return true;

         }

        

         @Override

         protected void onDestroy() {

                   // TODO Auto-generated method stub

                   super.onDestroy();

                   manager.destroyLoader(1);

         }

}

 

public class MyLoader extends AsyncTaskLoader<Cursor> {

         private final static String TAG = "MyLoader";

         private Context context;

         private Bundle bundle;

 

         // private ContentResolver resolver;

         public MyLoader(Context context, Bundle bundle) {

                   super(context);

                   this.context = context;

                   this.bundle = bundle;

                   // resolver=context.getContentResolver();

         }

 

         @Override

         /**

          * 在执行loadInBackground的耗时工作之前,会调用的一个方法

          * 强制执行loadInBackground方法

          */

         protected void onStartLoading() {

                   Log.i(TAG, "------onStartLoading----->>"

                                     + Thread.currentThread().getId() + ":"

                                     + Thread.currentThread().getName());

                   super.onStartLoading();

                   forceLoad();

         }

 

         @Override

         /**

          *完成耗时的工作

          */

         public Cursor loadInBackground() {

                   Log.i(TAG, "------loadInBackground----->>"

                                     + Thread.currentThread().getId() + ":"

                                     + Thread.currentThread().getName());

                   Cursor cursor = null;

 

                   // 耗时的工作:去ContentProvider或者本地的数据库中去装载大批量的数据

                   if (bundle == null) { // 初始化

                            // 去获取sms的数据

                            cursor = getContext().getContentResolver()

                                               .query(Uri.parse("content://sms"),

                                                                 new String[] { "_id", "address", "body" }, null,

                                                                 null, null);

                   } else {

                            // restart

                            String keyword = bundle.getString("KEY");

                            cursor = getContext().getContentResolver().query(

                                               Uri.parse("content://sms"),

                                               new String[] { "_id", "address", "body" }, "body like ?",

                                               new String[] { keyword + "%" }, null);

                   }

 

                   return cursor;

         }

 

         @Override

         /**

          * 并不是代表数据加载完成,只是停止装载(有可能数据没有装载完成),当应用程序退出的时候会触发这个方法

          */

         protected void onStopLoading() {

                  Log.i(TAG, "------onStopLoading----->>"

                                     + Thread.currentThread().getId() + ":"

                                     + Thread.currentThread().getName());

                   super.onStopLoading();

                   stopLoading(); // 停止数据装载

         }

        

}



CursorLoader的使用步骤:

1.       构建一个LoaderManager   manager = getLoaderManager();

2.       loaderManager实现并初始化loader  manager.initLoader(1, null, this);

3.       Activity实现LoaderCallbacks<Cursor>接口,并实现为实现的方法

4.       构建SimpleCursorAdapter,并且数据源设为一个空值

5.       绑定适配器

案例:

 

public classMainActivity extends Activity implements LoaderCallbacks<Cursor> {

         private ListView listView_main_info;

         private TextView textView_main_info;

         private LoaderManager manager;

         private SimpleCursorAdapter adapter;

         private Cursor cursor = null;

 

         @Override

         protected void onCreate(BundlesavedInstanceState) {

                   super.onCreate(savedInstanceState);

                  setContentView(R.layout.activity_main);

 

                   listView_main_info =(ListView) findViewById(R.id.listView_main_info);

                   textView_main_info =(TextView) findViewById(R.id.textView_main_info);

 

                   manager = getLoaderManager();

                   manager.initLoader(1, null,this);

 

                   adapter = newSimpleCursorAdapter(this,

                                     android.R.layout.simple_list_item_2,null, new String[] {

                                                        "_id","display_name" }, new int[] {

                                                        android.R.id.text1,android.R.id.text2 }, 1);

                   listView_main_info.setAdapter(adapter);

                   listView_main_info.setEmptyView(textView_main_info);

                  

                   // 注册上下文菜单

                   registerForContextMenu(listView_main_info);

         }

 

         @Override

         public Loader<Cursor>onCreateLoader(int id, Bundle bundle) {

                   if (bundle == null) {

                            return newCursorLoader(MainActivity.this,

                                               ContactsContract.RawContacts.CONTENT_URI,new String[] {

                                                                 "_id","display_name" }, "deleted=0", null, null);

                   } else {

                            String keyword =bundle.getString("KEY");

                            return newCursorLoader(MainActivity.this,

                                               ContactsContract.RawContacts.CONTENT_URI,new String[] {

                                                                 "_id","display_name" },

                                               "deleted=0and display_name like ?", new String[] { keyword

                                                                 +"%" }, null);

                   }

         }

 

         @Override

         public voidonLoadFinished(Loader<Cursor> loader, Cursor data) {

                   adapter.swapCursor(data);

                   cursor = data;

         }

 

         @Override

         public voidonLoaderReset(Loader<Cursor> loader) {

                   adapter.swapCursor(null);

         }

 

         @Override

         public voidonCreateContextMenu(ContextMenu menu, View v,

                            ContextMenuInfomenuInfo) {

                   super.onCreateContextMenu(menu,v, menuInfo);

 

                   AdapterContextMenuInfo info =(AdapterContextMenuInfo) menuInfo;

                   cursor.moveToPosition(info.position);

                   menu.add(0, 1, 0, "删除联系人");

                   menu.setHeaderTitle(cursor.getString(cursor

                                     .getColumnIndex("display_name")));

 

         }

 

         @Override

         public booleanonContextItemSelected(MenuItem item) {

                   AdapterContextMenuInfo info =(AdapterContextMenuInfo) item

                                     .getMenuInfo();

                   String display_name =cursor.getString(cursor

                                     .getColumnIndex("display_name"));

                   switch (item.getItemId()) {

                   case 1:

                            // 删除信息

                            ContentValues values= new ContentValues();

                            values.put("deleted",1);

                            int count =getContentResolver().update(

                                               ContactsContract.RawContacts.CONTENT_URI,values,

                                               "display_name=?",new String[] { display_name });

                            if (count > 0) {

                                     // 重启Loader

                                     manager.restartLoader(1,null, MainActivity.this);

                            }

                            break;

 

                   default:

                            break;

                   }

                   returnsuper.onContextItemSelected(item);

         }

 

         @Override

         public boolean onCreateOptionsMenu(Menumenu) {

                   getMenuInflater().inflate(R.menu.main,menu);

 

                   SearchView searchView =(SearchView) menu.findItem(R.id.action_search)

                                     .getActionView();

 

                   searchView.setOnQueryTextListener(newOnQueryTextListener() {

 

                            @Override

                            public booleanonQueryTextSubmit(String query) {

                                     // TODOAuto-generated method stub

                                     returnfalse;

                            }

 

                            @Override

                            public booleanonQueryTextChange(String newText) {

                                     Bundlebundle = new Bundle();

                                     bundle.putString("KEY",newText);

                                     manager.restartLoader(1,bundle, MainActivity.this);

                                     returnfalse;

                            }

                   });

                   return true;

         }

        

         @Override

         public booleanonOptionsItemSelected(MenuItem item) {

                   switch (item.getItemId()) {

                   case R.id.action_contacts: //查看联系人的信息

                            Intent intent =newIntent();

                            intent.setAction("com.android.contacts.action.LIST_CONTACTS");

                            startActivity(intent);

                            break;

                   case R.id.action_restore: // 恢复删除的联系人

                            ContentValues values= new ContentValues();

                            values.put("deleted",0);

                            int count =getContentResolver().update(

                                               ContactsContract.RawContacts.CONTENT_URI,values, null,

                                               null);

                            if (count > 0) {

                                     // 重启Loader

                                     manager.restartLoader(1,null, MainActivity.this);

                            }

                            break;

                   default:

                            break;

                   }

                   returnsuper.onOptionsItemSelected(item);

         }

}

 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值