java之寫(xiě)接口回調(diào)編程經(jīng)驗(yàn)改進(jìn)
1、問(wèn)題
在一個(gè)類(lèi)里面數(shù)據(jù)的變化需要在另外一個(gè)類(lèi)里面動(dòng)態(tài)得到,比如在我的異步任務(wù)里面下載的數(shù)據(jù),需要在UI界面的ProgressDialog里面動(dòng)態(tài)顯示,我們需要在異步任務(wù)里面寫(xiě)個(gè)接口,然后接口里面有一些函數(shù),至于在ProgressDialog顯示的時(shí)候,我們只需要重寫(xiě)接口,然后傳遞到異步任務(wù)里面去就行,一般在傳遞到異步任務(wù)里面去我們可以通過(guò)構(gòu)造方法傳遞或者,set一個(gè)接口進(jìn)去。
2、一般實(shí)現(xiàn)辦法
這里通過(guò)構(gòu)造方法傳遞接口
public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
public interface CallBack {
//開(kāi)始下載彈出進(jìn)度對(duì)話框
public void startDownload();
//更新進(jìn)度值
public void updateProgress(int progress);
//下載完成,消失對(duì)話框,并且安裝apk,需要apk的路徑
public void finishDownload(String apkPath);
//下載失敗
public void downloadFail();
}
public CallBack mCallback;
public DownloadApkTask (CallBack callback) {
this.mCallback = callback;
}
@Override
protected File doInBackground(Void... params) {
//***
if (mCallback != null) {
mCallback.startDownload();
}
//***
}
}
3、改進(jìn)
public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
public interface CallBack {
//開(kāi)始下載彈出進(jìn)度對(duì)話框
public void startDownload();
//更新進(jìn)度值
public void updateProgress(int progress);
//下載完成,消失對(duì)話框,并且安裝apk,需要apk的路徑
public void finishDownload(String apkPath);
//下載失敗
public void downloadFail();
CallBack DEFAULT = new CallBack(){
@Override
public void startDownload() {
Log.debug(TAG, "DownloadApkTask startDownload");
}
@Override
public void updateProgress(int progress) {
}
@Override
public void finishDownload(String apkPath) {
}
@Override
public void downloadFail() {
}};
}
public CallBack mCallback = CallBack.DEFAULT;
public DownloadApkTask (CallBack callback) {
if (callback == null)
this.mCallback = CallBack.DEFAULT;
else
this.mCallback = callback;
}
@Override
protected File doInBackground(Void... params) {
mCallback.startDownload();
}
}
我們?cè)诮涌诶锩鎸?xiě)了一匿名對(duì)象DEFAULT,然后mCallback初始化的時(shí)候,賦值為DEFAULT,然后在構(gòu)造方法里面?zhèn)鬟f了這個(gè)接口,這里就爽我們傳遞空接口進(jìn)去也沒(méi)事,而且后面的調(diào)用接口的方法startDownload()方法的時(shí)候不需要判斷if(mCallback != null),因?yàn)槲覀冊(cè)跇?gòu)造方法里面已經(jīng)做了處理,如果傳遞為空接口到構(gòu)造方法里面去,我們調(diào)用startDownload()方法的時(shí)候,就會(huì)在interface CallBack里面的DEFAULT對(duì)象里面的startDownload()方法,然后打印日志,如果傳遞不是空接口到購(gòu)置函數(shù)里面,調(diào)用startDownload()方法的時(shí)候,會(huì)調(diào)用外部接口回調(diào)里面的重寫(xiě)的startDownload()方法。
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門(mén)到禿頭 或掃描下面二維碼
零基礎(chǔ)入門(mén)進(jìn)階人工智能(鏈接)