AsyncTask线程类的使用
下面以一个 “多线程异步方式实现文件复制” 实例来体会一下AsyncTask的使用。
(1)FileMoveAsyncTask类(继承并实现AsyncTask类)
package com.android.androidpractice0824.async;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/*
使用多线程异步方式实现文件复制
查看文件复制效果的方式:直接在手机“文件管理->我的手机”根目录下的zzw文件夹和zzwcopy文件夹
*/
public class FileMoveAsyncTask extends AsyncTask<String, Integer, String> {
private TextView tv;
public FileMoveAsyncTask(){
super();
}
/*
该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法
触发onProgressUpdate进行相关操作
*/
//文件路径filePath都是到其父目录,没到文件本身
@Override
protected String doInBackground(String... filePath) {
//该方法主要编写线程运行时的操作
copyFile(filePath[0], filePath[1]);
return null;
}
//该方法运行在UI线程中
@Override
protected void onPreExecute() {
//该方法主要编写线程执行前的操作
Log.d("onPreExecute", "开始执行异步线程");
}
@Override
protected void onPostExecute(String s) {
//该方法主要编写线程执行后的操作
Log.d("onPostExecute", "异步线程执行结束");
}
//复制文件
public boolean copyFile(String filePathFrom, String filePathTo) {
File fileFrom = new File(filePathFrom);
File fileTo = new File(filePathTo);
if(!fileFrom.exists()) {
fileFrom.mkdir();
Log.d("FileMoveAsyncTask: ", "copyFile: " + "文件fileFrom不存在,重新创建!");
}
if(!fileTo.exists()) {
fileTo.mkdir();
Log.d("FileMOveAsyncTask: ", "copyFile: " + "文件fileTo不存在,重新创建!");
}
boolean isCopySuc = false;
File fileFrom2 = new File(filePathFrom + "data.txt");
File fileTo2 = new File(filePathTo + "data.txt");
try {
InputStream is = new FileInputStream(fileFrom2);
FileOutputStream fos = new FileOutputStream(fileTo2);
byte[] buffer = new byte[1024];
int byteCount = 0;
while ((byteCount = is.read(buffer)) != -1) {
fos.write(buffer, 0, byteCount);
}
fos.flush();
fos.close();
is.close();
isCopySuc = true;
Log.d("FileMoveAsyncTask", "copyFile: " + "文件复制成功");
}catch (java.io.FileNotFoundException e) {
Log.d("FileMoveAsyncTask: ", fileTo2.toString());
Log.d("FileMoveAsyncTask: ", "The FileTo doesn't exist");
} catch (IOException e) {
Log.d("FileMoveAsyncTask", "copyFile" + e.getMessage());
}
return isCopySuc;
}
}
(2)在需要执行线程操作的地方写如下语句即可(这里执行的是文件复制,就传入了被复制的文件所在的文件夹路径以及复制后的文件存放的路径)
FileMoveAsyncTask myTask = new FileMoveAsyncTask();
myTask.execute("/sdcard/zzw/", "/sdcard/zzwcopy/");
补充说明:关于AsyncTask类的execute()函数的参数见:
execute函数详解
补充知识
线程与线程池
深入理解线程和线程池(图文详解)_weixin_40271838的博客-CSDN博客_线程池
AsyncTask多线程
AsyncTask的应用
参考:
https://www.runoob.com/w3cnote/android-tutorial-ansynctask.html
handle消息传递机制
参考:
https://www.runoob.com/w3cnote/android-tutorial-handler-message.html
对于AsyncTask execute的理解
参考:
https://blog.csdn.net/myhc2014/article/details/50700971
对于AsyncTask构造函数三个参数的理解
参考:
https://www.cnblogs.com/woider/p/5172780.html
IPC机制(进程间通信)
参考:
execute函数详解