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

举报
chenyu 发表于 2021/07/27 01:41:41 2021/07/27
1.4k+ 0 0
【摘要】 1、问题 在一个类里面数据的变化需要在另外一个类里面动态得到,比如在我的异步任务里面下载的数据,需要在UI界面的ProgressDialog里面动态显示,我们需要在异步任务里面写个接口,然后接口里面有一些函数,至于在ProgressDialog显示的时候,我们只需要重写接口,然后传递到异步任务里面去就行,一般在传递到异步任务里面去我们可以通过构造方法传递或者,set一个接口...

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()方法。

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/80642853

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。