您的位置:首页 > 编程语言 > Java开发

深度解析java接口回调机制

2016-11-14 15:47 579 查看
一、系统源码分析

package com.itheima.testinterface;

public class CompoundButton {

/**
* 接口回调四步走战略:1.定义一个接口(接口中当然要包括方法)
*                2.定义一个接口变量
*                3.设置一个接口监听
*                4.在满足某一条件下接口变量调用接口方法
*/

//1.定义一个接口(接口里面包含方法)
public static interface OnCheckedChangeListener {
void onCheckedChanged(CompoundButton buttonView, boolean isChecked);
}

//2.定义一个接口变量
private OnCheckedChangeListener mOnCheckedChangeListener;

//3.设置一个接口监听
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}

public void setChanged(){
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, true);
}
}


}

package com.itheima.testinterface;

public class MyCheckBox extends CompoundButton{

}

package com.itheima.testinterface;

import com.itheima.testinterface.CompoundButton.OnCheckedChangeListener;

public class TestInterface {

public static void main(String[] args) {
// TODO Auto-generated method stub
MyCheckBox myCheckBox = new MyCheckBox();
myCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
}
});
}


}

二(1)、真实项目中用到的接口回调

A类:

/**

* 获取会员信息(为了获取用户验证身份的手机号码)

*/

public static void getUserInfo(final MallAuthenticationPresenter.TranslatCallback translatCallback) {

OkHttpRequestUtils.doRequest(UrlManager.getUrl("safeCenterAuthentication"), null, new RawCallback() {
@Override
public void onSuccess(String data) {
if (data.contains("您还没有登录,请登录!")) {
//用户还没有登录
translatCallback.noLogin();
} else {
//用户已经登录,进行json解析
MallUserInfoBean mallUserInfoBean = GsonUtil.JsonToBean(data, MallUserInfoBean.class);
translatCallback.hasLogin(mallUserInfoBean);
}
}

@Override
public void onBefore() {
translatCallback.onBefore();
}

@Override
public void onError(String errorMsg) {
translatCallback.onError(errorMsg);
}

@Override
public void onComplete() {
translatCallback.onComplete();

}
});
}


B类:

public class MallAuthenticationPresenter extends BasePresenter {

/**
* 获取会员信息
*/
public void getUserInfo(){
MallApi.getUserInfo(new TranslatCallback() {
@Override
public void noLogin() {
getView().noLogin();
}

@Override
public void hasLogin(MallUserInfoBean mallUserInfoBean) {
getView().showUserPhoneNum(mallUserInfoBean);
}

//网络请求之前
@Override
public void onBefore() {
if (getView() == null) {
return;

} else {
//显示正在加载的进度条
getView().showProgress(GetStringUtils.getLoadingString());
}
}

@Override
public void onError(String errorMsg) {

if (getView() != null) {
//显示加载失败的提示信息
getView().showToastError(errorMsg);

}
}

@Override
public void onComplete() {

if (getView() == null) {
return;
} else {
//使正在加载的进度进度条消失
getView().dismissProgress();
}
}
});
}
/**
* 传输状态的接口
*/
public interface TranslatCallback{
void noLogin();//没有登录
void hasLogin(MallUserInfoBean mallUserInfoBean);//已经登录
void onBefore();//网络请求之前
void onError(String errorMsg);//网络请求错误
void onComplete();//网络请求完成
}


二(2)针对上面例子 自己写的简单容易理解的例子

package com.itheima.testinterfaces;

import com.itheima.testinterfaces.B.IDog;

/**

*

* 这个类相当于adapter,只是调用了接口里的方法而已,接口作为方法的参数,但是具体的实现业务逻辑要放在写接口的那个类中

*

*/

public class A {

public static void methodA(IDog dog){
dog.say();
dog.eat();
dog.cry();
}


}

package com.itheima.testinterfaces;

public class B {

/**

* 这个类相当于Activity:接口和接口里的方法写在activity中完成具体的业务逻辑(比如adapter里item的删除操作)

*/

public static void methodB(){

A.methodA(new IDog() {

@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("狗说:");
}

@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗吃:");
}

@Override
public void cry() {
// TODO Auto-generated method stub
System.out.println("狗哭:");
}
});
}
interface IDog {
void say();
void eat();
void cry();
}


}

三(1)实际项目中用到的接口回调(编辑收货地址参照真实项目)

三、(2)根据上面的例子写自己的简单容易理解的接口回调

package com.itheima.testinterfacess;

(1)定义一个接口

public interface IDog {

void eat();
void say();
void cry();


}

(2)定义一个接口的实现类(A类)

package com.itheima.testinterfacess;

/**

* 具体的业务逻辑在这里实现

* @author Administrator

*

*/

public class A implements IDog{

@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("狗吃:");
}

@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("狗说:");
}

@Override
public void cry() {
// TODO Auto-generated method stub
System.out.println("狗哭:");
}


}

(3)B类

package com.itheima.testinterfacess;

public class Test {

public static void main(String[] args) {
IDog dog = new A();//这里new一个接口的实现类
dog.cry();
dog.eat();
dog.say();
}


}

输出结果:

狗哭:

狗吃:

狗说:

四、实际项目中运用的接口回调(我的商城商品收藏ListView与adapter之间)

1、在addaprer中:

三步走战略:(1)、定义一个接口

(2)、定义一个接口变量

(3)、对外暴露一个方法

当点击某一个button的时候用接口变量调用接口中的方法

比如实际中的项目:

(1)interface OnProductClickListener {

//点击条目跳转商品详情
void frontView(int position);

//点击取消收藏
void cancelCollect(int position);


}

(2)private OnProductClickListener onProductClickListener;

(3)public void setOnProductClickListener(OnProductClickListener onProductClickListener) {

this.onProductClickListener = onProductClickListener;

}

(4)view.getFrontView().setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (onProductClickListener != null) {
//当点击某一个按钮的时候触发调用接口里面的方法
onProductClickListener.frontView(position);

}


});

2、在activity 中用适配器变量调用在适配器中暴露出来的方法

比如在实际的项目中:

adapter.setOnProductClickListener(new OnProductClickListener() {

@Override

public void frontView(int position) {

String productId;

productId = list.get(position).getProductId();

/跳转到新版的商品详情页/

//当在adapter中点击跳转的时候,具体的业务逻辑在activity中实现。

StartActivityUtils.goToProductDetailActivity(MallProductCollectActivity.this, productId);

}

@Override

public void cancelCollect(int position) {

String productId1;

productId1 = list.get(position).getProductId();

Itemposition = position;

getPresenter().cancleCollect(productId1);

}

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