android 异步查找联系人

 今天看了Google官方对Accessing contacts data这部分的介绍,感觉我们在使用getLoaderManager().initLoader(0, null, this);时候,会在本类一般是view层的类里面实现参数三的接口,不过这里感觉没有将视图与数据分开,虽然initLoader是一个异步操作,使用继承asyncTaskLoader来查询联系人,这个我还是想将他包装一下,放到control层里面,也就是说写一个control类来做数据的查询,这个类不需要继承AsyncTask,因为仅仅做一个包装而已,内部initLoader是异步加载的

    上代码:

getLoaderManager().initLoader(0, null, new AsyncLoaderContacts(this,new AsyncLoaderContacts.OnSendCursor() {
   @Override
   public void sendCursor(ArrayList<SortModel> SourceDateList) {
    // TODO Auto-generated method stub
    HomeFragment_Contacts.this.SourceDateList=SourceDateList;//这是一个数据复制,在查询结束回调时候使用
    getDatas();    //这里处理查询到的数据,方法定义在view类里面
   }
  }));

    这里我们写了一个AsyncLoaderContacts来替代view需要实现的接口,并且自定义一个接口用于回调,话说这个回调接口我可是花了好久才理解该怎么用的

    关于AsyncLoaderContacts主要代码如下

 public class AsyncLoaderContacts implements LoaderCallbacks<Cursor>{
 WeakReference<Context> weakref= null;
 OnSendCursor osc=null;
 public AsyncLoaderContacts(Context context,OnSendCursor onSendCursor)
 {
  weakref=new WeakReference<Context>(context);
  this.osc=onSendCursor;
 }
 
 public final static String P_Name=ContactsContract.Contacts.DISPLAY_NAME;
 public final static String P_Number=ContactsContract.CommonDataKinds.Phone.NUMBER;
 static String[] selections=new String[]{ContactsContract.Contacts._ID,P_Name,P_Number};
 
 @Override
 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  // TODO Auto-generated method stub
  if(weakref.get()!=null)
  return new CursorLoader(weakref.get(), ContactsContract.CommonDataKinds.Phone.CONTENT_URI, selections, null, null, null);
  else 
   return null;
 }
 
 @Override
 public void onLoaderReset(Loader<Cursor> loader) {
  // TODO Auto-generated method stub
  
 }
 
 public interface OnSendCursor{
  public abstract void sendCursor(ArrayList<SortModel> sourcelist);
 }
 
 @Override
 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  // TODO Auto-generated method stub
  ArrayList<SortModel> adapter_datas=new ArrayList<SortModel>();
  data.moveToFirst();
  while(!data.isAfterLast())
  {
   
   SortModel idatas=new SortModel();
   idatas.setName(data.getString(data.getColumnIndex(P_Name)));
   idatas.setPhone(data.getString(data.getColumnIndex(P_Number)));
   adapter_datas.add(idatas);
   data.moveToNext();
  }
  if(this.osc!=null)    //回调函数,在View层里面处理
   osc.sendCursor(DateFilter.filledData(adapter_datas));    //参数主要是我想对数据的处理
 }
}

    这里面有个WeakReference是我在官方一步加载图片的时候看到的,他讲的是在主线程之外引用主线程内部的东西最好使用WeakReference,因为考虑到万一APP 销毁,而持有该APP的其他线程还保持着强引用,那么会导致内存泄露,所以用WeakReference最好了,不知道虚引用的百度哦~~这可是JAVA基础,其实我也是百度才知道的-w-,不过现在会用了

    总结下来,这次主要是熟悉了回调函数,对WeakReference使用的方法,这里貌似不是额外的线程,没必要使用WeakReference,不过没关系啦,假装继承的是AsyncTask来加载数据嘛

    吐槽一下.其实上面只是一个使用回调函数与异步加载的思想,只要理解这样的分层设计,话说这MVC我还不是很懂,不过我觉得就是将View与data分离嘛~

    学android,我倒是觉得看视频,书籍什么的都不行,学校的书籍千篇一律,大多数就是讲的基础,将Google的文档基础部分翻译一点就出书了,还说自己的版权,不如多逛逛人家的博客,最好就是看Google官方文档了,理解他的设计理念和设计方法,大多数都能为自己所用,当然了,也不是绝对的好,只有真正理解之后才能改进,可能说的有点过分啦,不过这只是我个人的想法罢了哦

    

 

转载于:https://my.oschina.net/persuit/blog/408287

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 异步编程是在 Android 应用中处理耗时操作的一种技术。在 Android 中,主线程(也称为 UI 线程)用于处理界面的绘制和用户交互,如果在主线程中执行耗时操作,会导致界面卡顿,影响用户体验。 为了避免在主线程中执行耗时操作,Android 提供了多种异步编程的机制,常用的有以下几种: 1. AsyncTask:AsyncTask 是一个轻量级的异步任务类,可以在后台执行耗时操作,并在主线程更新 UI。它通过重写 `doInBackground()` 方法执行后台操作,重写 `onPostExecute()` 方法更新 UI。但是 AsyncTask 已经被废弃,不再推荐使用。 2. Handler 和 Looper:Handler 和 Looper 用于在不同线程之间进行通信。通过创建 Handler 对象,可以将任务发送到主线程的消息队列中,在主线程中处理这些任务。这种方式需要手动管理消息队列和消息处理。 3. AsyncTaskLoader:AsyncTaskLoader 是 AsyncTask 的改进版,适用于加载数据并在界面上显示的情况。它提供了更好的生命周期管理和数据缓存机制。 4. RxJava:RxJava 是一个基于观察者模式的异步编程库,可以简化异步任务的处理。它使用可观察者和订阅者模式来实现异步操作,提供了丰富的操作符来处理异步任务。 5. Kotlin 协程:Kotlin 协程是一种轻量级的异步编程方式,可以在代码中使用类似同步代码的方式处理异步任务。它提供了简洁的语法和强大的并发处理能力。 以上是 Android 中常用的异步编程方式,开发者可以根据实际需求选择合适的方式来处理异步操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值