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

简单理解回调

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);

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