wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。分享其中关于 保存正在下载的图片URL集合和图片三种获取方式管理者,网络URL获取、内存缓存获取、外部文件缓存获取的代码供技术员学习参考使用。

package com.inuoer.util;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;

public class AsyncImageLoader {
	// 保存正在下载的图片URL集合,避免重复下载用
	private static HashSet<String> sDownloadingSet;
	// 软引用内存缓存
	private static Map<String, SoftReference<Bitmap>> sImageCache;
	// 图片三种获取方式管理者,网络URL获取、内存缓存获取、外部文件缓存获取
	private static LoaderImpl impl;
	// 线程池相关
	private static ExecutorService sExecutorService;

	// 通知UI线程图片获取ok时使用
	private Handler handler;

	/**
	 * 异步加载图片完毕的回调接口
	 */
	public interface ImageCallback {
		/**
		 * 回调函数
		 *
		 * @param bitmap
		 *            : may be null!
		 * @param imageUrl
		 */
		public void onImageLoaded(Bitmap bitmap, String imageUrl);
	}

	static {
		sDownloadingSet = new HashSet<String>();
		sImageCache = new HashMap<String, SoftReference<Bitmap>>();
		impl = new LoaderImpl(sImageCache);
	}

	public AsyncImageLoader(Context context) {
		handler = new Handler();
		startThreadPoolIfNecessary();

		String defaultDir = context.getCacheDir().getAbsolutePath();
		setCachedDir(defaultDir);
	}

	/**
	 * 是否缓存图片至/data/data/package/cache/目录 默认不缓存
	 */
	public void setCache2File(boolean flag) {
		impl.setCache2File(flag);
	}

	/**
	 * 设置缓存路径,setCache2File(true)时有效
	 */
	public void setCachedDir(String dir) {
		impl.setCachedDir(dir);
	}

	/** 开启线程池 */
	public static void startThreadPoolIfNecessary() {
		if (sExecutorService == null || sExecutorService.isShutdown()
				|| sExecutorService.isTerminated()) {
			sExecutorService = Executors.newFixedThreadPool(3);
			// sExecutorService = Executors.newSingleThreadExecutor();
		}
	}

	/**
	 * 异步下载图片,并缓存到memory中
	 *
	 * @param url
	 * @param callback
	 *            see ImageCallback interface
	 */
	public void downloadImage(final String url, final ImageCallback callback) {
		downloadImage(url, true, callback);
	}

	/**
	 *
	 * @param url
	 * @param cache2Memory
	 *            是否缓存至memory中
	 * @param callback
	 */
	public void downloadImage(final String url, final boolean cache2Memory,
			final ImageCallback callback) {
		if (sDownloadingSet.contains(url)) {
//			Log.i("AsyncImageLoader", "###该图片正在下载,不能重复下载!");
			return;
		}

		Bitmap bitmap = impl.getBitmapFromMemory(url);
		if (bitmap != null) {
			if (callback != null) {
				callback.onImageLoaded(bitmap, url);
			}
		} else {
			// 从网络端下载图片
			sDownloadingSet.add(url);
			sExecutorService.submit(new Runnable() {
				@Override
				public void run() {
					final Bitmap bitmap = impl.getBitmapFromUrl(url,
							cache2Memory);
					handler.post(new Runnable() {
						@Override
						public void run() {
							if (callback != null)
								callback.onImageLoaded(bitmap, url);
							sDownloadingSet.remove(url);
						}
					});
				}
			});
		}
	}

	/**
	 * 预加载下一张图片,缓存至memory中
	 *
	 * @param url
	 */
	public void preLoadNextImage(final String url) {
		// 将callback置为空,只将bitmap缓存到memory即可。
		downloadImage(url, null);
	}

}

  

wemall-mobile详情下载地址:http://www.koahub.com/home/product/56

wemall官网地址:http://www.wemallshop.com

wemall 开源微商城 ,微信商城,商城源码,三级分销,微生鲜,微水果,微外卖,微订餐---专业的o2o系统

wemall app中基于Java获取和保存图片的代码的更多相关文章

  1. wemall app商城源码中基于JAVA通过Http请求获取json字符串的代码

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.分享其中关于通过Http请求获取json字符串的代码供 ...

  2. wemall app商城源码中基于JAVA的Android异步加载图片管理器代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  3. wemall app商城源码中基于JAVA的绑定和处理fragments和viewpager之间的逻辑关系代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  4. wemall app商城源码中基于PHP的ThinkPHP惯例配置文件代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  5. 支付宝APP支付(基于Java实现支付宝APP支付)

    贴一下支付核心代码,以供后续参考: 业务层 import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; ...

  6. 微信APP支付(基于Java实现微信APP支付)

    步骤: 导入maven依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> & ...

  7. Android中通过Java获取Webview加载内容

    有时候我们需要在加载webview时,获取加载完成的内容,当然,WebView也是有可能包含javascript.通过以下操作,我们是可以获取到WebView加载的内容. 1.自定义一个内部类,获取W ...

  8. web中纯java获取配置文件中的数据

    /*********获取配置文件,但配置文件中的值改变,不会随着值的改变也获取的参数值改变**********/  /**   * 原因是因为,类装载,装载完后,不会再去装载了   * *///  I ...

  9. 【Spring】28、Spring中基于Java的配置@Configuration和@Bean用法.代替xml配置文件

    Spring中为了减少xml中配置,可以生命一个配置类(例如SpringConfig)来对bean进行配置. 一.首先,需要xml中进行少量的配置来启动Java配置: <?xml version ...

随机推荐

  1. 添加redo日志组和添加日志组多元化

    查看redo日志组的状态和日志的位置. SQL> 没有被使用,所以切几次日志,组合4已生效. SQL> select * from v$log; GROUP#   THREAD#  SEQ ...

  2. C# 程序只能执行一次

    应用程序的主入口点. //每一个程序只能运行一个实例 bool isRun = false; System.Threading.Mutex m = new System.Threading.Mutex ...

  3. 在Eclipse中提交SVN项目的时候注意提交项目信息

    提交项目的时候,注意提交.classpath,.project和.settings文件夹: 这些是项目的信息,别人下载的时候才能正确显示为Eclipse项目:

  4. HDU2553(回溯)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. 《JAVASCRIPT高级程序设计》节点层次和DOM操作技术

    DOM可以将任何HTML和XML文档描绘成一个由多层次节点构成的结构.节点分为几种不同的类型,每种类型分别表示文档中不同的信息,每种类型都继承与Node接口,因此都共同享有一些属性和方法,同时,也拥有 ...

  6. WinForm 进程、线程

    一.进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using Sys ...

  7. Xcode自带iOS测试方法

    在说Xcode自带测试方法前先讲下程序在内存中的空间划分, 一般可分为5个部分: #1. BSS段, 存放未初始化的全局变量. BSS是英文Block Started by Symbol的简称.BSS ...

  8. matlab中同一文件定义子函数的方法

    在matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且M文件名必须和主函数相同在一个m文件中通常有两种定义子函数的方法: 1.嵌套定义 myfunc1会和主函数共享变量名.这种情况 ...

  9. 升级到appcompat v7 21.0.2之后遇到的问题解决方法

    1)一开始是手动直接覆盖文件到对应的lib project下,提示数个style找不到.原因是新旧版本的文件命名和结构不同,所以这个问题只需要把project目录清空,重新复制文件即可解决. 2)发现 ...

  10. Loadrunner 在controller中运行socket脚本时报错:Abnormal termination, caused by mdrv process termination 的原因和解决方法

    原因: 网上给出的可能的原因大致有两个: 1.  压力负载机器的资源不足(CPU,内存) 2.  分配内存和释放内存的语句不匹配. 并给出了一些解决方案,最开始我以为是加了IP地址的原因,不断尝试增加 ...