* 说实话,对应这个类,我还是比较陌生的。虽然知道是大概是怎么一回事。但是没有具体的去使用过。一般都是new Thread()+Handler去解决子线程更新UI的问题。
* 不过看了慕课网 http://www.imooc.com/video/7314 对于AsyncTask的讲解,非常容易理解,于是就写了一个简单的使用AsyncTask加载网络图片的Demo。
1. 加载网络资源,添加一个用户权限:
<uses-permission android:name="android.permission.INTERNET" />
2.写一个布局文image_activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/action_settings"
android:padding="16dp" />
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" />
</RelativeLayout>
3.Activity代码:(使用AsyncTask加载网络图片)
package com.example.asynctask;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.annotation.SuppressLint;
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;
public class ImageTestActivity extends Activity {
private static final String URL = "http://news.cnr.cn/native/gd/20150930/W020150930482969794794.jpg";
// private static final String URL1 = "http://diopic.net/images/2015/10/02/ebcf3a897c69cacc2ee81a47751defa4.jpg";
private static final String URL2 = "http://att.bbs.duowan.com/forum/201304/18/0932088bi83i3si8s8gdbb.jpg";
private ImageView imageView;
private ProgressBar progressBar;
private MyAsyncTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_activity);
imageView = (ImageView) findViewById(R.id.imageview);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
task = new MyAsyncTask();
task.execute(URL2);
}
@Override
protected void onPause() {
if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
task.cancel(true);
}
super.onPause();
}
/**
* 加载网络图片的异步任务<br>
* String--传入的参数, Void--进度参数, Bitmap--返回参数
*/
class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {
@Override
protected void onPreExecute() {
// 异步任务开始执行前调用的方法UI
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
progressBar.setMax(100);
}
@Override
protected void onPostExecute(Bitmap result) {
// 异步任务执行完成调用的方法 UI
super.onPostExecute(result);
progressBar.setVisibility(View.GONE);
if (result == null) {
imageView.setImageResource(R.drawable.ic_launcher);
} else {
imageView.setImageBitmap(result);
}
}
@SuppressLint("NewApi")
@Override
protected Bitmap doInBackground(String... params) {
if (isCancelled()) {
return null;
}
// 异步任务执行耗时操作调用的方法 非UI
Bitmap bitmap = null;
String url = params[0];
URLConnection connection;
InputStream is;
try {
for (int i = 0; i < 88; i++) {
publishProgress(i);
// Thread.sleep(100);
}
connection = new URL(url).openConnection();
is = connection.getInputStream();
System.out.println("isLegnth=" + is.available());
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);
System.out.println("bitmap=" + bitmap.getByteCount());
bis.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
if (isCancelled()) {
return;
}
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
}
}
}
代码运行ok.
* 关于AsyncTask,有几点注意:
* * 1. 就是AsyncTask的三个参数:<Params, Progress, Result> 分别是:Params=需要传入的参数(可以不传,不传就Void);Progress=显示进度的参数。(一般是Integer,或者不搞进度就Void); Result=异步任务执行的结果。比如我是需要加载图片,那么我就让Result=Bitmap。(没有返回结果就Void);
* * 2. AsyncTask有一个task.cancel();的方法,以及一个 task.isCancelled();方法。一个是发送取消异步任务的请求,一个是判断是否发送过这样的请求。一般可以通过isCancelled();的方法去改变doInBackground(..);方法里面的逻辑,比如:如果有取消的请求,就提前return,否则就正常执行。