Java回调方法(CallBack)

一、前言

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

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

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

  3. 回调
    回调的机制是:
    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

四、后语

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

你可能感兴趣的:(Java,java)