深度解析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);
}
});

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章