码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-07-29 17:18:48      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:android   asynctask   下载   网络   

网络操作是一个严重的耗时操作,所以从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示例——加载网络图片

标签:android   asynctask   下载   网络   

原文地址:http://blog.csdn.net/zgljl2012/article/details/47129495

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!