一 什么是异步任务
* 逻辑上:以多线程的方式完成的功能需求
* API上:指 AsyncTesk 类
二 AsyncTask的理解
* 在没有AsyncTask之前,我们用 Handler+Thread 就可以实现异步任务的功能需求
* AsyncTask 是对Handler 和 Thread 的封装,使用它编码更简洁,更高效
* AsyncTask 封装了ThreadPool , 比直接使用Thread 效率更高
三 相关API
* AsyncTask : 简化 Handler 处理多线程通信的问题
* AsyncTask<Params, Progress, Result>
Params 启动任务执行的输入参数,比如HTTP请求的URL
Progress 后台任务执行的百分比
Result 后台执行任务最终返回的结果,比如String
* execute(Params... params) :启动任务,开始任务的执行流程
* void onPreExecute()
在分线程工作开始之前在UIThread 中执行,一般用来显示提示视图
* Result doInBackground(Params... params)
在workerThread 中执行,完成任务的主要工作,通常需要较长的时间
* void onPostExecute(Result result)
在doInBackground() 执行完后在UIThread 中执行,一般用来更新界面
* publishProgress(Progress... values) : 在分线程中, 发布当前进度
* void onProgressUpdate(Progress... values) : 在主线程中更新进度
四 过程分析
五 代码
public class AsyncTaskActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asynctask);
}
private File apkFile;
private ProgressDialog dialog;
public void downloadApk(View v){
//启动异步任务
new AsyncTask<Void, Integer, Void>() {
//1. 主线程,显示提示视图
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(AsyncTaskActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
//准备用于保存APK文件的File对象:/storage/sdcard/Android/packagename/files/xxx.apk
apkFile = new File(getExternalFilesDir(null),"update.apk");
}
//2.分线程,联网请求
@Override
protected Void doInBackground(Void... arg0) {
try {
String path = "http://11.14.4.160:8080/Web_Server/L04_DataStorage.apk";
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
int responseCode = connection.getResponseCode();
if(responseCode == 200){
dialog.setMax(connection.getContentLength());
InputStream is = connection.getInputStream();
FileOutputStream fos = new FileOutputStream(apkFile);
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!= -1){
fos.write(buffer, 0, len);
//dialog.incrementProgressBy(len);
//在分线程总,发布当前进度
publishProgress(len);
//休息一会(模拟网速慢)
SystemClock.sleep(50);
}
fos.close();
is.close();
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//3.主线程,更新界面
@Override
protected void onPostExecute(Void result) {
dialog.dismiss();
installAPK();
}
//在主线程中更新进度(在publishProgress()之后执行)
protected void onProgressUpdate(Integer[] values) {
dialog.incrementProgressBy(values[0]);
};
}.execute();
}
/*
* 启动安装APK
*/
private void installAPK(){
Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(intent);
}
}