【Android基础】AsyncTask示例——加载网络图片

来源:互联网 发布:阿里云域名修改 编辑:程序博客网 时间:2024/06/05 18:44

网络操作是一个严重的耗时操作,所以从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";@Overrideprotected 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> {@Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap = null;    //待返回的结果String url = params[0];  //获取URLURLConnection 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//返回给后面调用的方法return bitmap;}@Overrideprotected void onPreExecute() {//显示等待圆环mProgressBar.setVisibility(View.VISIBLE);}@Overrideprotected 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。

下面是下载后的结果:
这里写图片描述

2 0
原创粉丝点击