深度解析java接口回调机制

Posted Lqc_javaEngineer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度解析java接口回调机制相关的知识,希望对你有一定的参考价值。

一、系统源码分析
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接口回调机制的主要内容,如果未能解决你的问题,请参考以下文章

Java回调机制解析

JAVA回调机制解析

java回调机制

Java 回调机制的理解

java 序列化机制深度解析

JAVA回调机制和观察者模式实例分享