【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。

下面是下载后的结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 19:31:42

【Android基础】AsyncTask示例——加载网络图片的相关文章

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

Android利用Volley框架加载网络图片

Volley框架是在Google I/O 2013上Volley发布的,目的是使Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.我们也简单了解下Volley引入的背景,在Volley出现以前,我们可能面临如下的问题,比如要在ListView或是GridView中加载数量较多的图片时:先在ListAdapter#getView()里开始图像的读取,再通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源,然后在AsyncTask#onPostEx

[android]完美解决ListView加载网络图片乱跳问题

为什么 先说一下为什么会出现图片乱跳. 使用convertView对ListView的每个item优化,item的复用可以有效降低内存的占用,使ListView滑动更为流畅.但会带来一个问题,当最顶部的item滑出屏幕时,会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的.其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(只有一半在屏幕里能看到了)的还是指向 同一块内存.加载的了同一张

Android之ListView异步加载网络图片(优化缓存机制)

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: [java] view plain copy public class MemoryCache { private static final

Afinal加载网络图片及下载文件使用方法

Afinal快速开发框架使用起来非常方便,下面将讲解如何利用Afinal加载网络图片及下载文件: 先看效果图: 注意:使用Afinal前需添加Afinal的jar,可以在这里下载:http://download.csdn.net/detail/baiyuliang2013/7313587 其中包括了Afinal的源码和jar,使用时只需添加jar包即可,在学习阶段也可以直接添加源码到你的项目中,可以更深入的学习Afinal. 看代码: activit_main.xml: <RelativeLay

android 安卓异步加载网络图片,与viewpager结合使用示例

[1]异步加载图片类AsyncImageLoader package com.example.testdddleapk.cus; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.HashMap; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.

利用LruCache加载网络图片实现图片瀑布流效果(基础版)

MainActivity如下: package cc.patience3; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 采用瀑布流的形式加载大量网络图片 * 详细分析参见WaterfallScrollView * * 参考资料: * 1 http://blog.csdn.net/guolin_blog/article/details/10470797 * 2 http://blog.csdn.net

Android Volley入门到精通:使用Volley加载网络图片

在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完全解析(一),初识Volley的基本用法. 在上篇文章中有提到过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架.我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;