本次初步学习了解了AsyncTack的的用法。AsyncTack的主要作用于通知主线程在子线程中更新UI;封装、简化异步操作。
构建AsyncTask子类参数:
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需求指定如下三个泛型参数。
Params:启动任务时输入参数类型。
Progress:后台任务执行中返回进度值的类型。
Result:后台执行任务完成后返回结果的类型。
构建AsyncTask子类的回调方法:
dolnBackground:必须重写,异步执行后台线程将要完成的任务。
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作。
onPostExecute:当dolnBackground()完成后,系统会自动调用onPostExecute()方法,并将dolnBackground方法返回的值传回该方法,展示处理结果
onProgressUpdate:在dolnBackground()方法中调用publishProgress()方法更新任务的执行进度,就会触发该方法。
AsyncTask方法启动用execute方法启动。
实例(通过网络地址加载图片并显示)
在此附上帅照一张为程序运行效果图。
布局文件中,我采用了进度条和图片空间,先把进度条控件隐藏起来。AsyncTask放回回调onPreExecute方法再显示出来。
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:padding="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.a13468.asynctack01.MainActivity">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressbar"
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity.java文件
由于网速过快,导致与于进度条还没有显示图片就夹在完了,使用线程Treed.sleep(3000),让图片3秒后显示
package com.example.a13468.asynctack01;
/**
* 通过网络地址下载显示一张图片
*/
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;//手动导入URL包
import java.io.InputStream;
import java.net.URLConnection;
public class MainActivity extends Activity {
private ImageView image;
private ProgressBar progressbar;
//创建网络地址
private static String URL="http://b226.photo.store.qq.com/psb?/V11P5K533TzyHM/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = findViewById(R.id.image);
progressbar = findViewById(R.id.progressbar);
new MyAsyncTack().execute(URL);//启动AsyncTack方法
}
class MyAsyncTack extends AsyncTask<String,Void,Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
progressbar.setVisibility(View.VISIBLE);//进度条可见
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
progressbar.setVisibility(View.GONE);//进度条不可见
image.setImageBitmap(bitmap);
}
@Override
protected Bitmap doInBackground(String... strings) {
//获取传递进来的参数
String url=strings[0];//传递参数取出对应的URL地址
Bitmap bitmap=null;
URLConnection connection;//定义网络连接对象
InputStream is;//用于获取数据的输入流
try {
connection =new URL(url).openConnection();//获取网络连接对象
is=connection.getInputStream();//获取输入流
Thread.sleep(3000);//睡眠3秒显示加载图片
BufferedInputStream bis=new BufferedInputStream(is);
bitmap= BitmapFactory.decodeStream(bis);//将输入流解析成bitmap;
//关闭输入流
is.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return bitmap;
}
}
}