通过回调函数原理及接口的形式实现下载进度条效果

  1. 回调函数回顾
    顾名思义,当A类调用B类某个方法时,该方法再调用A类的某个方法,即回调A了,而怎么回调呢?当A类调用B类的某个方法时则需要传一个A类父类接口即可,这样调用B类的方法时,这个方法可以获取传过来的A类父类接口进行回调了。
    2.实现进度条思路
    前端通过两个接口进行获取参数,第一个接口是传达下载的命令,第二个接口是每秒钟获取进度条的进度。
    3.A类代码
package com.example.yurgqg.callback;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


public class A implements Callback {
    private B b;
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public A(B b) {
        this.b = b;
    }
    public void xiazai(String file) {
        b.xiazai(this, file);
    }

    @Override
    public void callBackJinDu(String jindu) {
        this.message = jindu;
    }

}

4.B类代码
package com.example.yurgqg.callback;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock;

public class B extends Thread {
private ReentrantLock lock = new ReentrantLock();

public void xiazai(Callback callback, String fileName) {
    callback.callBackJinDu(fileName + "下载开始!");
    CountDownLatch countDownLatch = new CountDownLatch(10);
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            lock.lock();
            for (int i = 1; i <= 100; i++) {
                if (i % 10 == 0) {
                    try {
                        Thread.sleep(2000);
                        callback.callBackJinDu("当前进度:" + i + "%");
                        Thread.sleep(2000);
                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            lock.unlock();
        }
    });
    thread.start();
    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    callback.callBackJinDu(fileName + "下载结束!");
}

}
5.Callback接口类

package com.example.yurgqg.callback;

public interface Callback {

    void callBackJinDu(String jindu);
}

6.CallbackController类

package com.example.yurgqg.callback;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/yu")
public class CallbackController {
    public static final A a = new A(new B());
    @GetMapping("/xiazai")
    public void xiazai(@RequestParam("name") String name){
        a.xiazai("活着");
    }
    @GetMapping("/callback")
    public Map<String,Object> res(){
        Map<String,Object> map = new HashMap<>();
        map.put("count",a.getMessage());
        return map;
    }

}

7.效果图
在这里插入图片描述在这里插入图片描述在这里插入图片描述

8.写在最后
鄙人不才,若高人不吝赐教,吾将从之。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值