案例描述:
通过一个固定的URL连接,从网上加载图片,并最后形成Bitmap显示在ImageView上,
同时在加载的过程中,显示一个进度条,加载完毕后关掉进度条,显示图片。
(1)main_layout.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"
android:orientation="vertical" >
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone" />
</RelativeLayout>
(2)MainActivity.java文件:
package mMainActivity;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import com.test.asynctaskdemoxiao.R;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class MainActivity extends Activity{
private ImageView mImageView;
private ProgressBar mProgressBar;
private static String url = "http://img0.imgtn.bdimg.com/it/u=1070902365,2619384777&fm=21&gp=0.jpg";
private MyAsycTask mTesk;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
mImageView = (ImageView) findViewById(R.id.image);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
// 通过MyAsycTask的execute就可以开启异步线程操作,
// 在execute方法中传进去一个或多个参数作为下面String... params的参数。
mTesk = new MyAsycTask();
mTesk.execute(url);
}
/*
* 在Activity执行onPause生命周期时,我们对AsyncTask进行判断,
*
* */
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
// 当不为空且Running:
if(mTesk != null && mTesk.getStatus() == AsyncTask.Status.RUNNING){
// cancel方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。
mTesk.cancel(true);
}
}
/*
* 创建内部类 MyAsycTask:
* 三个参数<url类型,进度值类型,返回值类型>
* */
class MyAsycTask extends AsyncTask<String, Integer, Bitmap>{
/*
* 在doInBackground方法之前先执行onPreExecute方法:
* 异步操作的初始化操作。
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
// 将ProgressBar显示出来:
mProgressBar.setVisibility(View.VISIBLE);
}
/*
* 真正的异步操作处理
* */
@Override
protected Bitmap doInBackground(String... params) {
// 第一步:获取传递进来的参数
// String... params代表可变长数组,也就是说我们可以传递不止一个参数进来,
// 由于我们只传进来一个参数,所以取对应的url即可。
String url = params[0];
Bitmap bitmap = null;
URLConnection connection;
InputStream is; // 用于获取数据的输入流。
try {// 将一个URL对象解析程一个Bitmap对象:
connection = new URL(url).openConnection(); // 获取网络连接对象
is = connection.getInputStream(); // 获取输入流
BufferedInputStream bis = new BufferedInputStream(is);
// 模拟整个进度栏的更新:
for(int i=0; i<100; i++){
publishProgress(i); // 这里的这个i值会传给下面onProgressUpdate的values
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 第二步:通过decodeStream解析输入流为bitmap对象:
bitmap = BitmapFactory.decodeStream(bis);
is.close(); // 关闭输入流
bis.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 将Bitmap作为返回值返回给后面调用的方法(onPostExecute):
return bitmap;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 将进度值传给我们布局中的进度条
mProgressBar.setProgress(values[0]);
}
/*
* 在doInBackground方法之后执行onPostExecute方法:
* 可以在这里操作UI,设置图像,
* */
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
// 取消进度条显示:
mProgressBar.setVisibility(View.GONE);
// 设置图像显示内容:
mImageView.setImageBitmap(result);
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.asynctaskdemoxiao"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="20" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="mMainActivity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>