java之写接口回调编程经验改进

1、问题

在一个类里面数据的变化需要在另外一个类里面动态得到,比如在我的异步任务里面下载的数据,需要在UI界面的ProgressDialog里面动态显示,我们需要在异步任务里面写个接口,然后接口里面有一些函数,至于在ProgressDialog显示的时候,我们只需要重写接口,然后传递到异步任务里面去就行,一般在传递到异步任务里面去我们可以通过构造方法传递或者,set一个接口进去。


 
2、一般实现办法

这里通过构造方法传递接口


    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,然后在构造方法里面传递了这个接口,这里就爽我们传递空接口进去也没事,而且后面的调用接口的方法startDownload()方法的时候不需要判断if(mCallback != null),因为我们在构造方法里面已经做了处理,如果传递为空接口到构造方法里面去,我们调用startDownload()方法的时候,就会在interface CallBack里面的DEFAULT对象里面的startDownload()方法,然后打印日志,如果传递不是空接口到购置函数里面,调用startDownload()方法的时候,会调用外部接口回调里面的重写的startDownload()方法。




作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)