1.问题
(1)什么是AsyncTask?
一个Android 已封装好的轻量级异步类,属于抽象类,即使用时需 实现子类。
(2)AsyncTask如何使用?
创建 AsyncTask 子类 并重写核心方法,接着创建 AsyncTask子类的实例对象,最后调用execute(()从而执行异步线程任务
2.异步任务常用方法
(1)onPreExecute():执行 线程任务前的操作
(2)doInBackground():接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
(3)onProgressUpdate():在主线程 显示线程任务执行的进度
(4)onPostExecute():接收线程任务执行结果、将执行结果显示到UI组件
(5)onCancelled():将异步任务设置为:取消状态
3.
异步下载的实现
3.1实现步骤
(1)权限申请,网络权限,读写外部存储权限
(2)布局
(3)下载前做什么(UI是怎样的)
(4)下载中做什么(UI有没有变化)
(5)下载后做什么(UI该变成哪样)
3.2代码演示
(1)权限申请
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
(2)布局android:layout_marginTop=“15dp”
(3)初始化视图initView();设置点击监听setListener();初始化UI数据 setData();
(4)下载前onPreExecute()(在UI线程中)
设置进度条,Buton,TextView
protected void onPreExecute() {
super.onPreExecute();
mDownloadButton.setText(R.string.downloading);
mResultTextView.setText(R.string.downloading);
mProgressBar.setProgress(INIT_PROGRESS);
}
(5)下载过程中(另一个线程中)
protected Boolean doInBackground(String... params) {
String apkUrl = params[0];
URL url = new URL(apkUrl);
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
// 获取了下载内容的总长度
int contentLength = urlConnection.getContentLength();
// 下载地址准备
mFilePath = Environment.getExternalStorageDirectory()
+ File.separator + FILE_NAME;
// 已下载的大小
int downloadSize = 0;
byte[] bytes = new byte[1024];
int length;
// 创建一个流
OutputStream outputStream = new FileOutputStream(mFilePath);
// 不断把内存的文件流写到目标文件中
while ((length = inputStream.read(bytes)) != -1){
// 挖到的放到我们的文件管道里
outputStream.write(bytes, 0, length);
// 累加我们的大小
downloadSize += length;
// 发送进度
publishProgress(downloadSize * 100/contentLength);
(5)下载完成后(UI线程)
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
// 在主线程中 ,执行结果 处理
mDownloadButton.setText(result? getString(R.string.download_finish) : getString(R.string.download_finish));
mResultTextView.setText(result? getString(R.string.download_finish) + mFilePath: getString(R.string.download_finish));
}
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 收到进度,然后处理: 也是在UI线程中。
if (values != null && values.length > 0) {
mProgressBar.setProgress(values[0]);
}
}