Java回调方法(CallBack) 您所在的位置:网站首页 callback函数不同步 Java回调方法(CallBack)

Java回调方法(CallBack)

2023-09-24 23:49| 来源: 网络整理| 查看: 265

一、前言

在进行应用开发时,不同模块之间存在着相互调用的关系。调用的方式分为以下几种:

同步调用 fun(a)调用fun(b),fun(a)等待fun(b)执行完后再进行下一步。 同步调用会引起代码的阻塞。

异步调用 fun(a)调用fun(b), fun(a)不等待fun(b)执行完便进行下一步。 常见的有Thread、Task等。

回调 回调的机制是: a) 类A的a()方法调用类B的b()方法 b) 类B的b()方法执行完毕主动调用类A的callback()方法

二、例子简介

实现一个最常见的功能:文件下载。当然这儿的下载不是真正的下载。 在下载的过程中,服务端可以返回给我们一些信息,比如:下载进度、下载状态、查看下载URL等。

三、代码实现 1. 接口定义

首先定义一个IDownloadStatusCallBack 接口,接口里面包含用户需要得知的信息,即:开始下载、结束下载、显示下载的URL、显示下载的进度。

package com.example.test.callback; public interface IDownloadStatusCallBack { public void startDownload(); public void stopDownload(); public void showDownloadURL(String url); public void showDownloadProgress(int progress); } 2. 客户端定义

定义一个Client客户端,并实现这些接口并打印相应的信息。

package com.example.test.callback; public class Client implements IDownloadStatusCallBack { private Server mServer = null; public Client() { // TODO Auto-generated constructor stub } public void download(String url) { mServer = new Server(Client.this, url); mServer.Run(); } @Override public void startDownload() { // TODO Auto-generated method stub System.out.println("startDownload"); } @Override public void stopDownload() { // TODO Auto-generated method stub System.out.println("stopDownload"); } @Override public void showDownloadURL(String url) { // TODO Auto-generated method stub System.out.println("Download URL: " + url); } @Override public void showDownloadProgress(int progress) { // TODO Auto-generated method stub System.out.println("DownloadProgress: " + progress + "%"); } } 3. 服务端定义

定义一个Server服务端,Server是对模拟下载过程的具体实现。 Server里面用定时器模拟下载进度,每隔1秒下载进度增长百分之十,到百分之百下载结束。 在执行过程中,通过IDownloadStatusCallBack 回调通知客户端下载进度等信息。

package com.example.test.callback; import java.util.Timer; import java.util.TimerTask; public class Server { private IDownloadStatusCallBack iCallBack; private String mDownloadUrl = null; private Timer mTimer = null; private int mProgress = 0; public Server(IDownloadStatusCallBack iCallBack, String url) { this.iCallBack = iCallBack; this.mDownloadUrl = url; mProgress = 0; } public void Run() { iCallBack.showDownloadURL(mDownloadUrl); // 回调下载URL iCallBack.startDownload(); // 回调开始下载 mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub iCallBack.showDownloadProgress(mProgress); // 回调下载进度 if (mProgress == 100) { // 下载进度至100% iCallBack.stopDownload(); // 回调下载结束 mTimer.cancel(); } mProgress += 10; } }, 0, 1000); } } 4. 用户调用

最后建立一个User用户,用户通过调用Client里面的download()方法来执行下载任务。

package com.example.test.callback; public class User { private static final String URL = "https://www.baidu.com"; public static void main(String[] args) { // TODO Auto-generated method stub Client client = new Client(); client.download(URL); } } 5. 数据打印

执行代码看到打印:

Download URL: https://www.baidu.com startDownload DownloadProgress: 0% DownloadProgress: 10% DownloadProgress: 20% DownloadProgress: 30% DownloadProgress: 40% DownloadProgress: 50% DownloadProgress: 60% DownloadProgress: 70% DownloadProgress: 80% DownloadProgress: 90% DownloadProgress: 100% stopDownload 四、后语

在执行一些通知类的操作时,采用回调比较方便。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有