简单理解回调
2017-02-14 18:24
477 查看
简单理解Android接口回调
举个例子来:比如我要显示手机联系人的信息
我的做法:1.定义一个类,这个类里面有一个方法可以获取手机联系人
2.activity通过执行这个类的方法,获得联系人信息
3.因为获取联系人信息要查询数据库,而查询数据库是耗时操作,因此要放在子线程.
那么问题来了:
查询联系人是在子线程中进行,activity也在进行主线程的运行,什么时候查询联系人完毕并把结果返回给activity?
答案就是:回调.
在这里简单说就是activity通过调用class的方法去获取联系人,然后class 通过activity里面的方法告诉activity联系人获取完毕,这就是回调.
代码:
public class GetPhoneNumberFromMobile { private List<ContactInfo> list; //这里说明一下第二个参数:这个是连接者,也就是通过这个接口,把查询到的联系人信息告诉activity public void getPhoneNumberFromMobile(final Context context, final ResultListener result) { try { list = new ArrayList<ContactInfo>(); //开启一个子线程,这里用了最简单的方法开启了子线程,项目中一般会用线程池 new Thread(new Runnable() { @Override public void run() { Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); //moveToNext方法返回的是一个boolean类型的数据 while (cursor.moveToNext()) { //读取通讯录的姓名 String name = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)); //读取通讯录的号码 String number = cursor.getString(cursor .getColumnIndex(Phone.NUMBER)); ContactInfo contactInfo = new ContactInfo(name,number); list.add(contactInfo); } **//这句话很关键!!!!!!! result.resultCallBack(list);** } }).start(); }catch (Exception e){ e.printStackTrace(); Toast.makeText(context, "请开启联系人权限!", Toast.LENGTH_SHORT).show(); } } //这个接口就是连接者,这个接口可以写在任何地方.也可以单独声明成一个文件 public interface ResultListener{ void resultCallBack(List<ContactInfo> list); } }
activity的代码,阉割之后的,只剩下精华
//关键点:实现接口 public class TestActivity extends BaseFragmentActivity implements GetPhoneNumberFromMobile.ResultListener{ private static final int FLUSH_LIST = 0; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what){ case FLUSH_LIST: flushListView(); break; default: break; } } }; @Override public void onResume() { super.onResume(); if (contactsList.size()>0){ adapter.setData(contactsList); loadLayout.flushLoadView(CustomLoadView.LOAD_SUCESS); } else{ initData(); } adapter.notifyDataSetChanged(); } private void initData() { if (getNum==null){ getNum = new GetPhoneNumberFromMobile(); } getNum.getPhoneNumberFromMobile(getActivity(),this); } //这里的list就是在上面class里面获取到的联系人信息,注意这个方法还运行在子线程,因此不能直接更新UI,可以用handler更新UI @Override public void resultCallBack(List<ContactInfo> list) { contactsList.clear(); contactsList.addAll(list); Message mes = Message.obtain(); mes.what = FLUSH_LIST; handler.sendMessage(mes); } }
相关文章推荐
- 最简单的方式理解“接口回调”的设计
- 浅谈Java回调机制的简单理解
- 关于回调的简单理解
- 回调的简单理解
- block 理解及 简单回调
- js中, apply方法简单理解(实现回调函数及参数传递)
- 简单理解回调
- 对于接口回调的简单理解
- 回调函数简单理解
- 一个简单例子让你彻底理解java回调机制
- Js (Javascript) 回调的简单理解
- 关于回调的简单理解(java)
- Java回调简单理解
- Android接口回调,最简单的理解方式
- Android回调接口简单理解
- JAVA 最简单的回调理解
- Java回调的简单理解
- 最简单的方式理解“接口回调”的设计
- Java中回调的简单理解
- 最简单的例子理解java回调