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表示的是需要打印的信息。这样在调试程序的时候就可以比较简单直接的发现错误进行修改。