完成了子线程中获取md5并发到主线程的功能

master
ThankVinci 4 years ago
parent d3948d704d
commit 08c03f4af8

@ -13,7 +13,10 @@ import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView;
import com.thankvinci.CloudKey.Fragment.FileManageFragment;
import com.thankvinci.CloudKey.MainActivity;
import com.thankvinci.CloudKey.R;
import com.thankvinci.CloudKey.Utils.FileHandler;
import com.thankvinci.CloudKey.Utils.FileThread;
import org.apache.commons.codec.digest.DigestUtils;
@ -67,12 +70,10 @@ public class FileAdapter extends RecyclerView.Adapter<FileAdapter.ViewHolder> {
}else{
//Toast.makeText(v.getContext(),fitem.getName()+" "+fitem.isCompress(),Toast.LENGTH_SHORT).show();
if (fitem.isCompress()){
try {
String filemd5 = DigestUtils.md5Hex(new FileInputStream(builder.toString()));
Toast.makeText(v.getContext(),"MD5码为:\n"+filemd5,Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
FileHandler fileHandler = new FileHandler((MainActivity)v.getContext());
Thread ft = new Thread(new FileThread(fileHandler,builder.toString(),null,0));
ft.start();
Toast.makeText(v.getContext(),"线程正在处理,请稍后",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(v.getContext(),"没有打开除文件夹和压缩包以外的功能",Toast.LENGTH_SHORT).show();
}

@ -1,6 +1,11 @@
package com.thankvinci.CloudKey.Files;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
@ -24,5 +29,8 @@ public class FileUtils {
});
}
//获取文件的MD5码值
public static void getFileMD5(File f){}
public static String getFileMD5(String path) throws IOException {
String filemd5 = DigestUtils.md5Hex(new FileInputStream(path));
return filemd5;
}
}

@ -19,6 +19,7 @@ import com.thankvinci.CloudKey.Files.FileAdapter;
import com.thankvinci.CloudKey.Files.FileItem;
import com.thankvinci.CloudKey.Files.FileUtils;
import com.thankvinci.CloudKey.R;
import com.thankvinci.CloudKey.Utils.MyUtils;
import java.io.File;
import java.util.ArrayList;
@ -58,6 +59,14 @@ public class FileManageFragment extends Fragment {
path_edit.setText(dir);
path_edit.setSelection(dir.length());
loadDirectory();
path_edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyUtils.copyToClipboard(getActivity(),path_edit.getText().toString());
Toast.makeText(getActivity(),"当前路径已复制到剪贴板",Toast.LENGTH_SHORT).show();
}
});
}
public String getDir(){
return dir;

@ -0,0 +1,27 @@
package com.thankvinci.CloudKey.Utils;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
public class FileHandler extends Handler {
//定义功能选择的常量 获取MD5和解压
final static int FUNCTION_GET_MD5 = 0;
final static int FUNCTION_DECOMPRESS = 1;
private Activity activity;
public FileHandler(Activity activity){
this.activity = activity;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case FUNCTION_GET_MD5:
Toast.makeText(activity,msg.getData().getString("md5"),Toast.LENGTH_SHORT).show();
break;
}
}
}

@ -0,0 +1,50 @@
package com.thankvinci.CloudKey.Utils;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import com.thankvinci.CloudKey.Files.FileUtils;
import java.io.IOException;
public class FileThread implements Runnable{
final static int FUNCTION_GET_MD5 = 0;
final static int FUNCTION_DECOMPRESS = 1;
private String srcPath,desPath,md5;
private Handler handler;
private int function;
public FileThread(Handler handler,String srcPath,String desPath,final int FUNCTION){
this.handler = handler;
this.srcPath = srcPath;
this.desPath = desPath;
this.function = FUNCTION;
}
@Override
public void run(){
Message msg = new Message();
Bundle data = new Bundle();
switch (function){
case FUNCTION_GET_MD5:
try {
md5 = FileUtils.getFileMD5(srcPath);
data.putString("md5",md5);
msg.what = FUNCTION_GET_MD5;
msg.setData(data);
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
break;
case FUNCTION_DECOMPRESS:
break;
default: break;
}
}
}

@ -0,0 +1,12 @@
package com.thankvinci.CloudKey.Utils;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
public class MyUtils {
public static void copyToClipboard(Activity activity,String str){
ClipboardManager cmb = (ClipboardManager)activity.getSystemService(Context.CLIPBOARD_SERVICE);
cmb.setText(str);
}
}

@ -224,3 +224,25 @@ public static final View.OnClickListener createNavigateOnClickListener(@IdRes in
将loadRoot和loadDirectory两个方法合并为loadDirectory(),本质上都是加载一个目录
发现不管怎么加载都是根目录的内容,随后发现是之前的一个错误想法:在当前的fragment刷新布局,然后原来的布局压栈,虽然找到了navigation的方法,但是为了节约资源将FileAdapter设置为单例模式没有改回来.
**2021/6/11**
实现获取文件md5码的功能,使用到的库是:implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'
**2021/6/11**
发现获取文件md5码的过程是在主线程中,当文件过大时,主线程阻塞,设置为子线程执行,之后的文件解压同理
涉及到线程和handler就得回到之前对handler的规范
本程序有两个线程,一个是NetThread,另一个是FileThread,同样就有两个Handler
先完成FileThread和FileHandler
FileThread主要处理 获取文件md5码和解压
FileHandler负责将获取到的md5码发到NetThread,然后将得到的密码输出到密码输入框
**2021/6/12**
完成了子线程中获取md5并发到主线程的功能
Loading…
Cancel
Save