异步任务AsyncTask_学习笔记

一 什么是异步任务

* 逻辑上:以多线程的方式完成的功能需求
* 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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值