`
jguangyou
  • 浏览: 375674 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 异步加载一张网络图片

 
阅读更多
/**
 * 从网络上异步加载单个图片
 * 
 *  
 */
public class LoadOneImageFromNet extends Activity {
	Button button;
	ImageView iView;
	String imageUrl = "http://image.club.china.com/twhb/7137652/2012/11/17/1353147018580.jpg";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.loadoneimagefromnet);
		button = (Button) this.findViewById(R.id.oneImageButton);
		iView = (ImageView) this.findViewById(R.id.oneImage);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				executeAsyncTask();

			}
		});
	}
	/**
  * 启动并执行异步加载任务
  */
	public void executeAsyncTask() {
		BitMapWorkTask bitMapWorkTask = new BitMapWorkTask(iView);
		iView.setImageResource(R.drawable.ic_launcher);// 设置加载等待图片
		bitMapWorkTask.execute(imageUrl);
		Log.i("info", "图片加载完成!");
	}

	/**
	 * 计算图片缩小比例
	 * 
	 * @param options
	 * @param reqWidth
	 * @param reqHeight
	 * @return
	 */
	public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			final int halfHeight = height / 2;
			final int halfWidth = width / 2;
			while ((halfHeight / inSampleSize) > reqHeight
					&& (halfWidth / inSampleSize) > reqWidth) {
				inSampleSize *= 2;
			}
		}
		return inSampleSize;
	}

	/**
	 * 从网络加载图片
	 * 
	 * @param uri
	 * @return
	 */
	public Bitmap decodeStreamBitmap(String uri) {
		Bitmap bitmap = null;
		HttpGet get = new HttpGet(uri);
		try {
			HttpClient client = new DefaultHttpClient();
			HttpResponse response = client.execute(get);
			HttpEntity entity = response.getEntity();
			InputStream inputStream = entity.getContent();
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			BitmapFactory.decodeStream(inputStream, null, options);
			int inSampleSize = calculateInSampleSize(options, 160, 130);
			options.inSampleSize = inSampleSize;
			options.inJustDecodeBounds = false;
			response = client.execute(get);
			entity = response.getEntity();
			inputStream = entity.getContent();
			bitmap = BitmapFactory.decodeStream(inputStream, null, options);

		} catch (Exception e) {
			e.printStackTrace();
		}
		return bitmap;
	}

	/**
	 * 异步加载数据类
	 * 
	 * 	  
	 */
	class BitMapWorkTask extends AsyncTask<String, Void, Bitmap> {
		// 定义一个对ImageView的弱引用,目的是异步线程不会干扰GC对ImageView对象的回收
		WeakReference<ImageView> imageReference;
		

		public BitMapWorkTask(ImageView imageView) {
			imageReference = new WeakReference<ImageView>(imageView);
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			return decodeStreamBitmap(params[0]);
		}

		@Override
		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			if (result != null && imageReference != null) {
				ImageView imageView = imageReference.get();
				if (imageView != null) {
					imageView.setImageBitmap(result);
				}
			}
		}
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/oneImageButton"
        android:layout_width="fill_parent"
        android:layout_height="50dp" android:text="load image from Internet"/>

    <ImageView
        android:id="@+id/oneImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true" />

</LinearLayout>

 效果图(点击按钮加载图片):




 
 

  • 大小: 248.7 KB
分享到:
评论

相关推荐

    Android使用GridView异步加载(弱引用)网络图片(支持点击查看)Demo

    在GridView中,每个单元格可能都需要加载一张图片,如果同步加载,性能会严重下降。 在本Demo中,最常使用的工具是`AsyncTask`或`Handler`,它们都是Android提供的异步处理机制。`AsyncTask`适用于简单的后台任务,...

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集.zip

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集: ‘360全景查看demo.rar afinal框架实现图片的简单异步缓存加载.rar andengine中直接加载多张小图片合成一张大图片生成动画精灵.rar android gif...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.rar

    本项目是关于如何在`Gallery`中异步加载网络图片,并且优化性能,只加载当前显示的页面图片。这涉及到Android UI编程、网络请求、线程管理和图片缓存等多方面的知识点。 1. **Android UI线程与工作线程**:Android...

    android网络异步加载轮播图

    在Android开发中,实现网络异步加载轮播图是一项常见的需求,特别是在制作各种应用的启动页、首页或者广告模块时。下面将详细讲解如何利用Android的相关技术和组件来完成这一功能。 首先,我们要理解"网络异步加载...

    安卓Gallery实现异步加载网络图片源代码

    这个标题"安卓Gallery实现异步加载网络图片源代码"暗示我们将会探讨如何在Android的Gallery视图中实现从网络异步加载图片,提高用户体验,避免阻塞主线程。描述进一步指出,该实现会优化性能,仅在用户停止滚动时...

    Android异步下载网络图片Viewpager实现广告幻灯片

    在这个案例中,我们关注的是如何利用`Android`的`ViewPager`组件和异步加载技术来创建一个自动播放的广告幻灯片,类似于新浪图片画廊的功能。 `ViewPager`是Android SDK中的一个强大控件,它允许用户左右滑动浏览多...

    异步加载图片实现图片放大缩小滑动换下张图片

    我们可以在ViewPager中设置一个PagerAdapter,这个Adapter负责加载图片,并在用户滑动时回调相应的接口,动态加载下一张或上一张图片。 在实现这些功能时,还需要注意图片的分辨率问题。高分辨率图片会占用更多内存...

    Android应用源码 Gallery实现异步加载网络图片

    `Android应用源码 Gallery实现异步加载网络图片`是一个典型的问题,它涉及到以下几个关键知识点: 1. **Gallery组件**:Gallery是Android SDK中的一个视图控件,它允许用户水平滚动选择项目,常用于图片或菜单的...

    android图片异步加载

    在Android应用开发中,图片异步加载是一项至关重要的技术,特别是在处理大量图片或者网络图片时。这不仅可以提高用户体验,避免因加载图片导致的界面卡顿,还能有效节省系统资源,防止内存溢出(OOM)的发生。本文将...

    网络异步加载图片的轮播图带点击方法

    在IT行业中,网络异步加载图片的轮播图是一种常见的用户界面组件,广泛应用于网站、APP等场景,用于展示多张图片并实现自动或手动切换。在这个特定的【标题】"网络异步加载图片的轮播图带点击方法"中,我们可以深入...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    在这个“android Gallery实现异步加载网络图片 并只加载当前停止页面图”的项目中,我们主要探讨以下几个关键知识点: 1. **异步加载**:在安卓中,使用AsyncTask或者IntentService可以实现在后台线程加载图片,...

    android listview 异步加载图片并防止错位

    "android listview 异步加载图片并防止错位"这个主题就是针对这些问题提出的一种解决方案。 异步加载图片是为了避免在主线程中执行耗时操作,导致UI卡顿。通常,我们使用异步任务(如AsyncTask)或者专门的图片加载...

    使用ImageLoader图片加载框架加载一张网络图片

    本文将详细介绍如何使用ImageLoader框架加载一张网络图片。 首先,我们需要理解ImageLoader的基本工作原理。ImageLoader的核心理念是将图片加载过程分为两个主要步骤:下载和显示。它使用内存和磁盘双重缓存机制,...

    Android从Json文件异步加载图片

    在Android应用开发中,从Json文件异步加载图片是一项常见的任务,它涉及到网络请求、数据解析、线程管理和UI更新等多个关键知识点。以下是对这些概念的详细解释。 首先,Json(JavaScript Object Notation)是一种...

    Viewpager加载网络图片轮播

    4. **网络图片加载**:在Android中,直接加载网络图片会涉及到IO操作和网络请求,一般会使用异步加载机制。可以使用HttpURLConnection、OkHttp等网络库进行网络请求,然后通过BitmapFactory.decodeStream()解析流为...

    Android 图片加载类 图库效果

    可以使用诸如RecyclerView结合GridLayoutManager来实现网格布局,同时结合Glide的预加载功能,确保用户在滚动时能快速看到下一张图片。 8. **错误处理和加载占位图** 在图片加载失败时,提供错误处理回调和加载...

    Android利用Gallery和ImageSwitcher实现在线相册图片预览功能(异步加载图片).zip

    异步加载图片是为了防止因为网络延迟或者图片大小过大导致应用卡顿。常见的异步加载库有Universal Image Loader、Picasso和Glide等。这些库提供了强大的图片缓存机制,可以在后台线程加载图片,减少主线程负担,同时...

    ListView利用内存缓存异步加载网络大图Demo

    总之,"ListView利用内存缓存异步加载网络大图Demo"是一个关于优化ListView图片加载的经典案例,它教会开发者如何有效地处理和显示Bitmap,以提高应用性能和用户体验。通过学习和理解这个Demo,开发者可以避免在实际...

    安卓Gallery照片墙画廊图库相关-Android利用Gallery和ImageSwitcher实现在线相册图片预览功能异步加载图片.rar

    它通常被用作动画过渡的容器,当用户点击或者滑动时,可以平滑地从一张图片过渡到另一张图片,为用户带来更好的视觉体验。在这个项目中,`ImageSwitcher`被用来在用户选择不同图片时,无缝地展示新选中的图片。 ...

Global site tag (gtag.js) - Google Analytics