java之寫接口回調(diào)編程經(jīng)驗改進

1、問題

在一個類里面數(shù)據(jù)的變化需要在另外一個類里面動態(tài)得到,比如在我的異步任務(wù)里面下載的數(shù)據(jù),需要在UI界面的ProgressDialog里面動態(tài)顯示,我們需要在異步任務(wù)里面寫個接口,然后接口里面有一些函數(shù),至于在ProgressDialog顯示的時候,我們只需要重寫接口,然后傳遞到異步任務(wù)里面去就行,一般在傳遞到異步任務(wù)里面去我們可以通過構(gòu)造方法傳遞或者,set一個接口進去。


 
2、一般實現(xiàn)辦法

這里通過構(gòu)造方法傳遞接口


    public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
     
        public interface CallBack {
            //開始下載彈出進度對話框
            public void startDownload();
            //更新進度值
            public void updateProgress(int progress);
            //下載完成,消失對話框,并且安裝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、改進

    public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
     
        public interface CallBack {
            //開始下載彈出進度對話框
            public void startDownload();
            //更新進度值
            public void updateProgress(int progress);
            //下載完成,消失對話框,并且安裝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();
        }
    }

我們在接口里面寫了一匿名對象DEFAULT,然后mCallback初始化的時候,賦值為DEFAULT,然后在構(gòu)造方法里面?zhèn)鬟f了這個接口,這里就爽我們傳遞空接口進去也沒事,而且后面的調(diào)用接口的方法startDownload()方法的時候不需要判斷if(mCallback != null),因為我們在構(gòu)造方法里面已經(jīng)做了處理,如果傳遞為空接口到構(gòu)造方法里面去,我們調(diào)用startDownload()方法的時候,就會在interface CallBack里面的DEFAULT對象里面的startDownload()方法,然后打印日志,如果傳遞不是空接口到購置函數(shù)里面,調(diào)用startDownload()方法的時候,會調(diào)用外部接口回調(diào)里面的重寫的startDownload()方法。




作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)