网络操作是一个严重的耗时操作,所以从Android 4.0版本开始,网络操作就被严禁放在主线程中,所以网络操作只能放在异步任务中。
下面是一个从网络上下载图片的示例,示例分为两个部分:
- 异步处理下载图片
- UI线程中处理图片
下载的图片是在百度图片里面随便找的:http://img1.ph.126.net/GPS04o8gJYuG4ZOwlx6UQA==/978125544087835399.jpg
首先是Layout布局,这个比较简单,只需要一个ImageView显示图片和一个progressBar以查看是否下载完成,代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="14dp"
tools:context="com.asynctasktest.MainActivity" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
/>
<ProgressBar
android:id="@+id/progressBar1"
android:visibility="gone"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
需注意把ProgressBar设置为隐藏:
下面是MainActivity里的代码:
package com.asynctasktest;
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 android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private ImageView mImageView = null;
private ProgressBar mProgressBar = null;
private String URL =
"http://img1.ph.126.net/GPS04o8gJYuG4ZOwlx6UQA==/978125544087835399.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化控件
this.mImageView = (ImageView) findViewById(R.id.imageView1);
this.mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
//实例化异步任务
ImageDownloadTask task = new ImageDownloadTask();
//执行异步任务
task.execute(URL);
}
class ImageDownloadTask extends AsyncTask<String,Void,Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null; //待返回的结果
String url = params[0]; //获取URL
URLConnection connection; //网络连接对象
InputStream is; //数据输入流
try {
connection = new URL(url).openConnection();
is = connection.getInputStream(); //获取输入流
BufferedInputStream buf = new BufferedInputStream(is);
//解析输入流
bitmap = BitmapFactory.decodeStream(buf);
is.close();
buf.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//返回给后面调用的方法
return bitmap;
}
@Override
protected void onPreExecute() {
//显示等待圆环
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(Bitmap result) {
//下载完毕,隐藏等待圆环
mProgressBar.setVisibility(View.GONE);
mImageView.setImageBitmap(result);
}
}
}
最后是要在AndroidManifest里加上网络访问权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
MainActivity里有一个内部类:ImageDownloadTask ,这个内部类用来下载指定URL的图片,并把图片在ImageView里显示出来。
将内部类异步处理部分(即doInBackground方法)看做一个异步图片下载器,我们传入这个下载器的是图片的URL,下载器传出的是图片,同时我们不需要知道图片加载进度,所以三个泛型参数的类型分别为String,Void和Bitmap。
当我们启动异步任务时,先执行onPreExecute方法,所以我们可以在这个方法里显示progressBar;然后就是启动子线程执行doInBackground,并将参数传给此方法,这个方法里会进行网络操作,下载图片并将其转为为Bitmap返回,返回后子线程也结束了;最后执行的是onPostExecute方法,这个方法获取的参数是异步处理后的结果,即下载好的图片,此方法给ImageView设置好下载好的图片并隐藏progressBar。
下面是下载后的结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。
【Android基础】AsyncTask示例——加载网络图片
原文地址:http://blog.csdn.net/zgljl2012/article/details/47129495