`

Gallery异步加载图片

 
阅读更多
Gallery异步加载图片

activity:
package org.hwq.gallery.activity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Gallery;

public class Gallery1Activity extends Activity {
	public static HashMap<String,Bitmap> cache;//加载完毕的图片缓存到这里
	private Gallery gallery;
	private List<String> imgUrl;//加载到gallery中的所有图片路径
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	//全屏
    	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置成全屏模式
    	//横屏
    	setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏
    	//没标题
    	requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //初始化操作
        init();
    }
    /**
     * 启动线程加载指定路径的图片到cache
     * @param url
     */
    public void loadImage(String url){
    	new Thread(new LoadImageThread(url,cache)).start();
    }
    /**
     * 初始化下缓存cache
     * 要加载到gallery中的图片路径
     * 初始Gallery并设置其adapter
     */
    public void init(){
    	cache = new HashMap<String, Bitmap>();
    	imgUrl = new ArrayList<String>();
    	imgUrl.add("http://fujian.xabbs.com/forum/201109/02/160646nn9hjjiimixvkxhe.jpg");  
    	imgUrl.add("http://img1.cache.netease.com/catchpic/A/A9/A9D98040B397C366AE93E67871346561.jpg");  
    	imgUrl.add("http://new.aliyiyao.com/UpFiles/Image/2011/01/13/nc_129393721364387442.jpg");  
    	imgUrl.add("http://pic.viewpics.cn/2011/07/03/naichaMMzhangzetianzuixinzhaopian/18.jpg");  
    	imgUrl.add("http://i1.sinaimg.cn/ent/m/c/2010-01-18/U1819P28T3D2847679F326DT20100118115712.jpg");  
    	imgUrl.add("http://comic.sinaimg.cn/2011/0824/U5237P1157DT20110824161051.jpg");  
    	imgUrl.add("http://t2.baidu.com/it/u=3142230130,2486626207&fm=52&gp=0.jpg");
    	imgUrl.add("http://t1.baidu.com/it/u=195272205,3957438954&fm=52&gp=0.jpg");
    	imgUrl.add("http://t2.baidu.com/it/u=2728825411,1745149447&fm=52&gp=0.jpg");
    	imgUrl.add("http://t3.baidu.com/it/u=4049625789,880707762&fm=52&gp=0.jpg");
    	imgUrl.add("http://t2.baidu.com/it/u=251271316,3044182410&fm=51&gp=0.jpg");
    	imgUrl.add("http://t2.baidu.com/it/u=1909869261,3407648852&fm=51&gp=0.jpg");
    	imgUrl.add("http://t2.baidu.com/it/u=3904233276,4064970722&fm=52&gp=0.jpg");
    	imgUrl.add("http://t3.baidu.com/it/u=179128931,289390833&fm=52&gp=0.jpg");
    	imgUrl.add("http://t3.baidu.com/it/u=67631552,1181502930&fm=52&gp=0.jpg");
    	imgUrl.add("http://t1.baidu.com/it/u=3156928874,2848088324&fm=51&gp=0.jpg");
    	imgUrl.add("http://t1.baidu.com/it/u=382878650,3995372735&fm=51&gp=0.jpg");
    	gallery = (Gallery) findViewById(R.id.gallery1);
    	ImageAdapter adapter = new ImageAdapter(this, imgUrl);
    	gallery.setAdapter(adapter);
    }
    
}


Galleryd的自定义ImageAdapter:
package org.hwq.gallery.activity;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter{
	private List<String> imgUrl;
	private Context context;
	
	public ImageAdapter(Context context,List<String> imgUrl){
		this.imgUrl = imgUrl;
		this.context = context;
	}

	public int getCount() {
		return imgUrl.size();
	}

	public Object getItem(int position) {
		return imgUrl.get(position);
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageView = new ImageView(context);
		//从前面定义的cache中找到该路径下的图片
		Bitmap map = Gallery1Activity.cache.get(imgUrl.get(position));
		imageView.setLayoutParams(new Gallery.LayoutParams(800,400));   
		imageView.setScaleType(ImageView.ScaleType.FIT_XY);
		if(map == null){
			//如果没加载的,则显示默认图片
			imageView.setImageResource(R.drawable.ic_launcher);
			//如果没有加载,则启动线程其加载
			((Gallery1Activity)context).loadImage(imgUrl.get(position));
		}else{
			//如果加载了的,则设置到Imageview
			imageView.setImageBitmap(map);
		}
		return imageView;
	}

}


加载图片线程LoadImageThread.java
package org.hwq.gallery.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class LoadImageThread implements Runnable{
	private String imageUrl;
	HashMap<String,Bitmap> cache;
	LoadImageThread(String url,HashMap<String,Bitmap> cache){
		this.imageUrl = url;
		this.cache = cache;
	}
	public void run(){
		try {
			System.out.println("开始加载"+imageUrl);
			//将指定的路径下的图片加载到定义的cache当中去
			InputStream imageStream = new URL(imageUrl).openStream();
			Bitmap map = BitmapFactory.decodeStream(imageStream);
			cache.put(imageUrl, map);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

例中使用到了URL,所以需要在AndroidManifest.xml添加相应的网络权限
<uses-permission android:name="android.permission.INTERNET"/>


OK,完事。
分享到:
评论
1 楼 shim 2012-10-11  
HashMap不是线程安全的,这么搞有风险

相关推荐

    gallery异步加载图片

    在网页设计和开发中,"gallery异步加载图片"是一个重要的技术实践,它涉及到用户体验优化、性能提升以及资源管理等多个方面。"Gallery Demo"可能是某个JavaScript库或框架的一个实例,用于展示如何在图像画廊中实现...

    Gallery异步加载图片和listView动态刷新 .rar

    本项目“Gallery异步加载图片和listView动态刷新”着重探讨如何优化这两个组件的性能,特别是在处理大量图像时。 Gallery组件是Android提供的一种可以左右滑动浏览的图片展示控件,它允许用户水平滚动查看图片,...

    Gallery异步加载当前页图片

    在处理大量图片时,考虑到性能和用户体验,异步加载图片变得至关重要。`Gallery`控件与异步加载相结合,可以有效地节省用户流量并提高应用的响应速度。 ### 1. `Gallery`控件介绍 `Gallery`是Android SDK提供的一...

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

    然后,我们需要创建一个自定义的`Gallery`适配器,这个适配器会负责获取每个图片的URL,并使用`Glide`异步加载图片: ```java public class ImageAdapter extends BaseAdapter { private Context context; ...

    android Gallery实现异步加载网络图片

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

    Gallery异步加载

    以下是一个关于如何实现`Gallery`异步加载图片的详细过程: 1. **使用AsyncTask**: `AsyncTask`是Android提供的一个用于在后台线程执行任务的工具,非常适合处理耗时操作,如网络请求和图片解码。创建一个`...

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

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

    经典的异步加载图片

    在Android开发中,异步加载图片是一个至关重要的技术,尤其对于图像密集型的应用,如相册、社交媒体等。异步加载能确保用户界面的流畅性,避免因为加载大量图片而阻塞主线程,提高用户体验。这里我们将深入探讨四种...

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

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

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

    本篇文章将详细介绍如何利用这两个组件实现异步加载图片,以提升用户体验。 首先,`Gallery`组件是一个水平滚动的视图,它允许用户通过滑动来选择和浏览多个项目。在我们的案例中,这些项目通常是图片的缩略图。...

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

    为了提高用户体验和应用性能,通常需要实现异步加载网络图片,并且只加载当前停止页面的图片,以避免不必要的网络请求和资源浪费。 实现异步加载网络图片并只加载当前停止页面图片的过程大致如下: 使用第三方的...

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

    **Android项目:Gallery异步加载网络图片并仅加载当前页图片** 本项目为一款基于Android的Gallery应用,实现了异步加载网络图片的功能,同时具备仅加载当前停止页面图片的特性,有效节省用户流量和提高应用性能。 ...

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

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

    android gallery 只加载当前图片 图片缓存 异步 下载

    比如,可以使用AsyncTask、Handler、Thread+Runnable或者现代的异步库,如RxJava、LiveData等来实现异步加载。 4. **图片下载**: 当图片不在本地缓存中时,需要从网络上下载。通常,我们会使用HTTP或HTTPS协议...

    android异步加载图片

    在Android开发中,异步加载图片是一个至关重要的技术点,特别是在使用像ListView、GridView、Gallery或Pager这样的组件时。这些组件通常需要展示大量的图片,如果直接在主线程中加载,会严重影响应用性能,甚至导致...

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

    总的来说,`Gallery`和`ImageSwitcher`的结合使用,配合异步加载图片技术,可以构建出一个高效、流畅的在线相册预览功能,提供良好的用户体验。这个项目源码对于深入理解Android图片处理和用户界面设计具有很高的...

    imageSwitcher在线相册 预览功能异步加载图片

    本项目"imageSwitcher在线相册 预览功能异步加载图片"就是针对这一需求的实现,它利用了`Gallery`和`ImageSwitcher`两个关键组件来构建。下面我们将详细探讨这两个组件以及异步加载图片的相关知识点。 1. **Gallery...

Global site tag (gtag.js) - Google Analytics