【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。
下面是下载后的结果:
- 【Android基础】AsyncTask示例——加载网络图片
- AsyncTask 网络加载图片及进度条的加载示例
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- [Android] AsyncTask使用实例---加载网络图片
- Android之AsyncTask网络加载图片
- AsyncTask异步加载图片示例
- 使用AsyncTask 加载网络图片
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
- Android 异步加载图片-AsyncTask
- Android 异步加载图片-AsyncTask
- android AsyncTask介绍 详解AsyncTask的使用 使用实例---加载网络图片
- Android之加载网络图片—ImageLoader
- 欧拉函数+中国剩余定理
- html5之创建离线Web应用程序
- java.lang.IllegalStateException: getOutputStream() has already been called for this response 分类: 异常
- hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并
- 短时间大量connect()返回errno 99: cannot assign request address
- 【Android基础】AsyncTask示例——加载网络图片
- hdu1627 Krypton Factor(回溯法)
- 正则表达式
- HP gives OpenVMS new life - A new road map for OpenVMS emerges from an HP agreement
- iOS开发使用Picker View实现一个图片浏览的App
- Ubiquitous Religions(POJ--2524
- VRRP(VirtualRouterRedundancyProtocol,虚拟路由冗余协议
- hdu1495 非常可乐(简单BFS)
- java学习提纲