构建AsyncTask子类的回调方法:
doInBackground:必须重写,异步执行后台线程将要完成的任务;
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作;
onPostExecute:当doInBackground()完成后,系统会自动调用该方法,并将doInBackground方法返回的值传递给该方法;
onProgressUpdate:在doInBackground方法中调用publishProgress()方法,更新任务的执行进度后,就会触发该方法。
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.d("abc", "doInBackground");
publishProgress();
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("abc", "onPreExecute");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d("abc", "onPostExecute");
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
Log.d("abc", "onProgressUpdate");
}
}
其中,doInBackground()方法实现逻辑:
1)从params[]数组中取出相应的值作为url;
2)访问网络操作;
3)将bitmap作为返回值,返回给后面调用的方法。
AsyncTask调用流程:
在主线程中通过AsyncTask实例调用execute()方法开启AsyncTask一步到位操作,在execute方法中传递一个或多个参数作为doInBackground()方法中的一个参数;
首先,系统会调用onPreExecute()方法,需要对其进行初始化操作;
接着,调用doInBackground()方法,开始真正异步操作方法,在其进行耗时操作,并将结果返回为我们指定的类型;
最终,在onPostExecute()方法中获取到返回的结果,因为onPostExecute()方法运行在主线程,从而可以对UI进行任意操作。
public class ImageTask extends Activity {
private ImageView imageView;
private ProgressBar progressBar;
private static String URL = "https://img-my.csdn.net/uploads/201504/12/1428806103_9476.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_task);
imageView = (ImageView) findViewById(R.id.image);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
new MyAsyncTask().execute(URL);// 设置传递进去的参数
}
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
// 获取传递进来的参数
String url = params[0];// 取出对应URL
Bitmap bitmap = null;
URLConnection connection;// 定义网络连接的对象
InputStream is;// 用于获取数据的输入流
try {// 将url所对应的图像解析成了bitmap
connection = new URL(url).openConnection();// 获取网络连接对象
is = connection.getInputStream();// 获取输入流
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);// 通过decodeStream将输入流解析成bitmap
is.close();// 关闭输入流
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
// 将bitmap作为返回值
return bitmap;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);// 显示进度条
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
// 操作UI,设置图像
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
}
}
}
编写xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImageTask" >
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
在MainActivity中设置开始异步操作。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyAsyncTask task = new MyAsyncTask();
task.execute();
}
public void loadImage(View view) {
startActivity(new Intent(this, ImageTask.class));
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="loadImage"
android:text="Image Test" />
</LinearLayout>
最后,要去清单文件中获取网络权限。
<uses-permission android:name="android.permission.INTERNET" />