2019级软件工程应用与实践-人工智能快递柜(代码分析8)

2021SC@SDUSC

线上下载媒体文件实现

主要是使用了MinioUtil类。
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。

public class MinioUtil {
    private static final String TAG = MinioUtil.class.getSimpleName();
    private static String endpoint;
    private static String accessKey;
    private static String accessSecret;
    private static String bucketName;
}

这是类里面的几个主要的变量。bucketName为存储桶

private static void initMinio() {
        if (bucketName == null) {
            ShadowProperties properties = PropertyUtils.getShadowProperties();
            endpoint = properties.getEndpoint();
            accessKey = properties.getAccessKey();
            accessSecret = properties.getAccessSecret();
            bucketName = properties.getBucketName();
        }
    }

为几个变量赋值。

public static void downloadByUrl(String fileUrl, DownLoadCallBack callBack) {
        new Thread(() -> {
            try {
//                URL url = new URL("http://47.92.169.255:9000" + "/cabinetdev/temp/sdu_1609330842794.jpg");
                URL url = new URL(fileUrl);
                URLConnection conn = url.openConnection();
                InputStream is = conn.getInputStream();
                callBack.call(is);

//                return is;
            } catch (Exception e) {
                e.printStackTrace();
//                return null;
            }
        }).start();
    }
}

通过URL()得到对应的url对象,即想要下载的媒体文件所在的位置。
使用URLConnection conn = url.openConnection();打开连接
使用InputStream is = conn.getInputStream();打开数据流
最后使用callBack()上传文件

public static void downloadByObjectName(String objectName, DownLoadCallBack callBack) {
        if (bucketName == null) {
            initMinio();
        }
        String downLoadUrl = endpoint + bucketName + objectName;
        Log.e(TAG, "down load url: " + downLoadUrl);
        downloadByUrl(downLoadUrl, callBack);
    }

里面的objectName 存储桶里的对象名称。如果存储桶为空,则进行初始化。如果已经存在存储桶,则构建下载地址downLoadUrl,调用上一个函数将媒体文件进行下载。

倒数秒的小组件相关代码分析

private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    if (num <= 0) {
                        flag = false;
                        listener.call();
                    } else {
                        num --;
                        Log.e(TAG, "handle message: " + num);
                        // 渲染显示数字
                        timeCounterView.post(() -> {
                            timeCounterView.setText(num + "");
                        });
                    }
                    break;
            }
            super.handleMessage(msg);
        }
    };

这个方法主要用于用户在非主界面进行停留时,给定一个限定的时间,使之在有限时间内可以返回主界面,保证项目的美观性和实用性。
使用msg.what作为在界面停留的时间估计,数字小于等于0时,使用listener.call();返回主界面。在数字大于0时,num减一,通过Log.e(TAG, "handle message: " + num);渲染显示数字在timeCounterView(数据展示的地方)显示,接着进行循环。

msg.obj与msg.what

  • msg.obj :是用来放对象的,这个对象可以是任何类型;
  • msg.what : 只能放数字;(在if判断中可以用到)
private Timer timer5;
private boolean flag = false;
public void rollMethod() {
        Log.e(TAG, "rollMethod: roll method");
        if(null == timer5) {
            timer5 = new Timer();
        }
        timer5.schedule(new TimerTask() {
            @Override
            public void run() {
//                Log.e(TAG, "rollMethod: roll method run");
                if(flag) {
                    handler.sendEmptyMessage(0);
                }
            }
        },100,1000);
    }

在timer为null时,要重新new一个timer对象
Timer的schedule()方法
第一个参数,是 new了TimerTask 类对象.使用者timer5要继承该类,因为 TimerTask类实现了 Runnable接口,所以应实现 public void run() 方法,在flag为ture时,调用handler.sendEmptyMessage(0)函数。当调用处是主线程的话,就运行在主线程中;要是在线程中,就相当于函数直接调用,运行在线程中。
第二个参数,指用户调用 schedule() 方法后,要等待100ms的时间才可以第一次执行 run() 方法。
第三个参数的意思就是,第一次调用之后,从第二次开始每隔1000ms的时间调用一次 run() 方法。

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_back_counter, container, false);

        initTimeCounter(view);

        rollMethod();

        return view;
    }

    TextView timeCounterView;
    private void initTimeCounter(View view) {
        timeCounterView = view.findViewById(R.id.time_counter_text);

    }

onCreateView()函数一共三个参数
1.inflater对象:可用于将XML转换为视图,
2.container:指向父容器的引用
3.savedInstanceState:保存的状态。
与其他方法比较不同的是:onCreateView()是在activity调用setContentView()时被调用。也就是activity上未完成onCreate(),因此不应该在此加入与activity的view相关的代码。而后面的生命周期这是在activity完成onCreate()之后调用的,倒计时的相关界面才能展现在界面上。

public void end() {
        flag = false;
    }
    public void reset() {
        Log.e(TAG, "reset ");
        num = COUNTER_NUMBER;
    }
    public void startCount() {
        Log.e(TAG, "start count");
        start();
    }

    interface CountTo0Listener {
        void call();
    }
    CountTo0Listener listener;
    // 调用方需指定此方法
    public void setCountTo0Listener(CountTo0Listener listener) {
        this.listener = listener;
    }

}
  • reset 重置
  • start 启动倒数
  • pause 停止倒数
  • onCountTo0 数到0时的回调
    其中Log.e方法带上(String tag, String msg)参数,tag表示的是打印信息的标签,msg表示的是需要打印的信息。这样在调试程序的时候就可以比较简单直接的发现错误进行修改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值