自定义按钮的点击事件的回调
1 步骤:
1 定义一个接口
2 在接口里面定义未实现的方法
3 传递一个实现了接口的对象
4 调用这个接口
2 案例:
2-1自定义的view:MyView
package com.cqc.callbackdemo01;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View{
public MyView(Context context) {
super(context);
}
//1 定义一个接口:
public abstract interface OnClickListemer{
//2 接口里面定义为实现逻辑的方法
public abstract void print();
}
public OnClickListemer mOnClickListemer;
//3 传递一个实现了接口的对象并赋值
public void setOnClickListemer(OnClickListemer mOnClickListemer){
this.mOnClickListemer = mOnClickListemer;
}
}
2-2 使用
MainActivity:
package com.cqc.callbackdemo01;
import com.cqc.callbackdemo01.MyView.OnClickListemer;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyView myView = (MyView) findViewById(R.id.myView);
// 4 调用实现接口的方法
myView.setOnClickListemer(new OnClickListemer() {
@Override
public void print() {
// TODO Auto-generated method stub
}
});
}
回调中使用回调
现在有这个需求:点击按钮后把phoneNumber和坐标一起发送到服务器,怎么做呢,我们知道获取坐标是异步的,采用的是回调,也就是我们必须在定位的回调走完后才可以网络请求。当我们把定位写在一个工具类中时,要想法Location发送到当前页,有3种方法。
第一种方法是用Handler
创建Handler对象,启动定位时,把handler也传递过去,定位成功后,用handler把location发送回来
第二种:EventBus传值
缺点:如果此时还有其它页面A没有finish(),而此时当前页B和A都用了EventBus来接收location,那么A和B都会接受到location,造成混乱。
方法三:定位回调中使用回调
当初写一个接口用来处理定位结果。
public interface LocateCallback {
void exec(TraceLocation location);
}
把定位的方法放在一个方法A中,定位成功后,调用回调
如:这是百度鹰眼中获取当前位置中的回调,参数是回调接口
public static void getCurrentLocation2(final LocateCallback callback) {
client.queryRealtimeLoc(serviceId, new OnEntityListener() {
//请求失败回调接口
@Override
public void onRequestFailedCallback(String message) {
}
//Entity实时定位回调接口
@Override
public void onReceiveLocation(TraceLocation traceLocation) {
super.onReceiveLocation(traceLocation);
callback.exec(traceLocation);
}
});
}
BDTraceUtil.getCurrentLocation2(new LocateCallback() {
@Override
public void exec(TraceLocation location) {
//根据location处理相关逻辑
}
});