关键词搜索

源码搜索 ×
×

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

发布2018-06-10浏览1346次

详情内容

1、问题

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

 

 

 

 

2、一般实现办法

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

 

  1. public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
  2. public interface CallBack {
  3. //开始下载弹出进度对话框
  4. public void startDownload();
  5. //更新进度值
  6. public void updateProgress(int progress);
  7. //下载完成,消失对话框,并且安装apk,需要apk的路径
  8. public void finishDownload(String apkPath);
  9. //下载失败
  10. public void downloadFail();
  11. }
  12. public CallBack mCallback;
  13. public DownloadApkTask (CallBack callback) {
  14. this.mCallback = callback;
  15. }
  16. @Override
  17. protected File doInBackground(Void... params) {
  18. //***
  19. if (mCallback != null) {
  20. mCallback.startDownload();
  21. }
  22. //***
  23. }
  24. }

 

 

 

 

 

 

3、改进

  1. public class DownloadApkTask extends AsyncTask<Void, Integer, File> {
  2. public interface CallBack {
  3. //开始下载弹出进度对话框
  4. public void startDownload();
  5. //更新进度值
  6. public void updateProgress(int progress);
  7. //下载完成,消失对话框,并且安装apk,需要apk的路径
  8. public void finishDownload(String apkPath);
  9. //下载失败
  10. public void downloadFail();
  11. CallBack DEFAULT = new CallBack(){
  12. @Override
  13. public void startDownload() {
  14. Log.debug(TAG, "DownloadApkTask startDownload");
  15. }
  16. @Override
  17. public void updateProgress(int progress) {
  18. }
  19. @Override
  20. public void finishDownload(String apkPath) {
  21. }
  22. @Override
  23. public void downloadFail() {
  24. }};
  25. }
  26. public CallBack mCallback = CallBack.DEFAULT;
  27. public DownloadApkTask (CallBack callback) {
  28. if (callback == null)
  29. this.mCallback = CallBack.DEFAULT;
  30. else
  31. this.mCallback = callback;
  32. }
  33. @Override
  34. protected File doInBackground(Void... params) {
  35. mCallback.startDownload();
  36. }
  37. }

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

 

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载