`

android实现服务器图片本地缓存

阅读更多

情况:在做ostocy-jshop开源系统的时候,需要做一个关于android如何进行服务器图片本地缓存的功能。我使用了如下几个东西。

 

1,android 本地数据库SQLite

        2,android下载网络图片

3,正则截取

4,Bitmap保存到本地

 

那就一个一个来说说吧

 

1,android 本地数据库SQLite:我要建立一个本地数据库,用来存放服务器返回的数据,缓存起来,下次就读取这个SQLite数据库了。

 

看代码先,然后解释

 

public class DBHelper extends SQLiteOpenHelper {
	
	//数据库名称
	public static final String DB_NAME="jshopmactive.db";
	
	//商品表名称
	public static final String GOODS_TM_NAME="goods_tm";
	

	//创建商品sql
	private static final String CREATE_GOODS_TM="create table "
		+"goods_tm(_id integer primary key autoincrement,goodsCategoryTid text,goodsid text,goodsname text,memberprice text,pictureurl text)";
	
	
	private SQLiteDatabase db;
	
	
	
	public DBHelper(Context context) {
		super(context, DB_NAME, null, 3);
		// TODO Auto-generated constructor stub
	}
	@Override
	public void onCreate(SQLiteDatabase db) {
		this.db=db;
		db.execSQL(CREATE_GOODS_TM);
	}

	public void createDB(){
		db=this.getWritableDatabase();
		db.execSQL(CREATE_GOODS_TM);
	}
	
	
	/**
	 * 插入数据
	 * @param values
	 * @param tablename
	 */
	public void insert(String tablename,ContentValues values){
		SQLiteDatabase db=this.getWritableDatabase();
		db.insert(tablename, null, values);
		db.close();
	}
	
	/**
	 * 查询数据
	 * @param tablename
	 * @return
	 */
	public Cursor query(String tablename){
		SQLiteDatabase db=this.getWritableDatabase();
		Cursor c=db.query(tablename, null, null, null, null, null, null);
		return c;
	}
	
	/**
	 * 查询数据
	 * @param tablename
	 * @return
	 */
	public Cursor queryByParam(String tablename,String param){
		SQLiteDatabase db=this.getWritableDatabase();
		Cursor c=db.rawQuery("select * from "+tablename+" where goodsCategoryTid=?", new String[]{String.valueOf(param)}); 
		return c;
	}
	
	/**
	 * 删除数据
	 * @param talbename
	 * @param id
	 */
	public void delete(String talbename,String id){
		if(db==null){
			db=this.getWritableDatabase();
			db.delete(talbename, "_id=?", new String[]{String.valueOf(id)});
		}
	}
	/**
	 * 删除所有数据
	 * @param tablename
	 */
	public void deleteAll(String tablename){
		if(db==null){
			db=this.getWritableDatabase();
			db.delete(tablename, null, null);
		}
	}
	
	/**
	 * 删除数据库表
	 * @param tablename
	 */
	public void DropTable(String tablename){
		db=this.getWritableDatabase();
		db.execSQL("drop table "+tablename);
	}
	/**
	 * 删除数据库
	 * @param tablename
	 */
	public void DropDB(){
		db=this.getWritableDatabase();
//		db.execSQL("drop database jshopmactive");
		onUpgrade(db,3,4);
	}
	
	/**
	 * 关闭数据库连接
	 */
	public void close(){
		if(db!=null){
			db.close();
		}
	}
	
	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		db.execSQL("DROP TABLE IF EXISTS "+TABLE_TM_NAME);
		db.execSQL("DROP TABLE IF EXISTS "+GOODS_CATEGORY_TM_NAME);
		db.execSQL("DROP TABLE IF EXISTS "+GOODS_TM_NAME);
        onCreate(db);
	}

}
 这里主要就是在建立数据表,抽取了一部分代码。

 

2,android下载网络图片:我通过android访问基于http的服务器方法,获取一个有图片的信息。

 

看代码

 

public ArrayList<HashMap<String, Object>> getGoodsList(String goodsCategoryTid) throws IOException {
		requestjsonstr = this.queryGoodsListForJshop(goodsCategoryTid);
		if (Validate.StrNotNull(requestjsonstr)) {
			JSONArray ja = (JSONArray) JSONValue.parse(requestjsonstr);
			for (int i = 0; i < ja.size(); i++) {
				HashMap<String, Object> map = new HashMap<String, Object>();
				JSONObject jo = (JSONObject) (ja.get(i));
				map.put("pictureurl",getPictureurlImg(JshopActivityUtil.BASE_URL+ jo.get("pictureurl").toString()));
				map.put("goodsname", jo.get("goodsname").toString());
				map.put("memberprice", "¥" + jo.get("memberprice").toString());
				map.put("goodsid", jo.get("goodsid").toString());
				map.put("goodsCategoryTid", goodsCategoryTid);
				map.put("pictureurlpath", downloadpcurl);
				goodslists.add(map);
			}
		}
		return goodslists;
	}

	private Bitmap getPictureurlImg(String pictureurl) throws IOException {
		URL url = new URL(pictureurl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5 * 1000);
		InputStream in = conn.getInputStream();
		Bitmap bm = BitmapFactory.decodeStream(in);
		// 保存本地图片
		String fileName=savePicturetoDeviceAndReturnFixedUrl(pictureurl);
		saveOnlinePictureToCard(bm,fileName);
		in.close();
		return bm;

	}
 

3,正则截取

 

/**
	 * 获取网络图片名称
	 * 
	 * @param pictureurl
	 * @return
	 */
	private String savePicturetoDeviceAndReturnFixedUrl(String pictureurl) {
		
		String regstr = "(http:|https:)\\/\\/[\\S\\.:/]*\\/(\\S*)\\.(jpg|png|gif)";
		String postfix = "", filename = "", resultstr = "";
		Pattern patternForImg = Pattern.compile(regstr,Pattern.CASE_INSENSITIVE);
		Matcher matcher = patternForImg.matcher(pictureurl);
		if (matcher.find()) {
			filename = matcher.group(2);
			postfix = matcher.group(3);
		}
		return resultstr = filename + "." + postfix;
	}
 

4,Bitmap保存到本地

 

private void saveOnlinePictureToCard(Bitmap bm, String fileName)
			throws IOException {
		File dirFile = new File(JshopMParams.SAVEPCPATH);
		if (!dirFile.exists()) {
			dirFile.mkdir();
		}
		String onlineFilePath = JshopMParams.SAVEPCPATH +fileName;
		File myOnlineFile = new File(onlineFilePath);
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(myOnlineFile));
		bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
		bos.flush();
		bos.close();
		this.downloadpcurl = onlineFilePath;
	}

 

详情请见https://github.com/sdywcd/ostocy-jshop 开源项目

 

分享到:
评论

相关推荐

    Android远程图片获取和本地缓存

    在Android应用开发中,远程图片的获取和本地缓存是一个重要的优化策略,旨在提升用户体验,避免因长时间等待网络加载而导致的无响应异常。通常,Android系统会在UI线程执行耗时操作超过5秒时抛出ANR(Application ...

    android本地缓存

    3. **图片缓存**: 使用类似`Picasso`或` Glide`的库,它们都支持本地缓存图片,避免重复加载和降低内存消耗。 4. **JSON数据对象缓存**: 将从服务器获取的JSON数据解析成对象并缓存,下次需要时直接从本地读取,减少...

    android 下载图片并缓存

    - **失效时间**:设置缓存图片的过期时间,超过这个时间则从服务器重新下载。 - **强制缓存**:在网络不稳定或无网络时,优先从本地缓存读取图片。 - **条件请求**:使用If-None-Match或If-Modified-Since头进行...

    Android网络图片缓存(网络cache和本地)

    下面将详细介绍网络缓存和本地缓存的概念及其在Android中的实现。 **网络缓存** 网络缓存,也称为HTTP缓存,遵循HTTP协议中的缓存策略。当一个图片请求被发送到服务器,服务器会根据响应头中的信息(如`Cache-...

    Android异步下载图片并且缓存图片到本地DEMO详解

    下面将详细介绍Android异步下载图片并且缓存图片到本地DEMO的实现细节。 一、异步下载图片 在Android中,异步下载图片可以使用AsyncTask类来实现。AsyncTask类提供了一个简单的方式来将耗时操作从主UI线程中分离...

    Android 图片缓存

    3. **网络缓存**:在网络请求图片时,如果服务器返回了可缓存的响应头,我们可以将图片数据暂存到本地,这就是网络缓存。当再次请求同一图片时,可以从网络缓存直接读取,避免了网络延迟。网络缓存可以进一步分为...

    unity下载服务器图片保存本地并加载(android和ios)

    unity下载服务器图片保存本地并加载(android和ios),判断本地是否存在,不存在就创建文件.

    带有本地缓存机制的http连接框架

    3. 内置缓存:内置了本地缓存机制,无需额外编写代码即可实现数据的本地存储和读取。 4. 支持多种请求方法:GET、POST、PUT、DELETE等HTTP方法都可轻松使用。 5. 请求参数与Header管理:方便地添加请求参数和自定义...

    Android http缓存实现

    在Android开发中,HTTP缓存是一种重要的技术,它允许应用程序在本地存储网络请求的数据,以便在没有网络连接或网络连接不稳定时仍能访问这些数据,从而实现离线应用的功能。HTTP缓存主要遵循HTTP协议中的缓存控制...

    Android实现新闻列表的磁盘缓存.zip

    在新闻列表的缓存实现中,Retrofit负责从服务器获取新闻数据,这些数据可能被存储到本地缓存中供后续使用。 4. Picasso:这是一款强大的图片加载库,能够自动处理图片的缩放、缓存等操作。在新闻列表中,每条新闻...

    Android图片下载三级缓存策略源码Demo

    "Android图片下载三级缓存策略源码Demo" 提供了一种解决方案,它利用了LruCache、软引用以及DiskLruCache来实现三级缓存机制。这种策略能够有效地减少网络请求,提高图片加载速度,同时节省设备资源。现在,让我们...

    Android 分页缓存图片加载器,gridview显示

    本项目针对这种情况,利用Android Studio进行开发,实现了分页缓存图片加载器,旨在提高图片加载速度并优化内存管理。 1. **Android GridView** GridView是一种可以显示多列数据的视图,常用于展示图片或列表项。...

    android缓存网络图片

    本文将深入探讨如何在Android应用中实现图片的网络缓存和本地存储。 首先,我们需要理解Android中的图片缓存分为两大部分:内存缓存和磁盘缓存。内存缓存通常是基于LRU(Least Recently Used)策略的HashMap,用于...

    android图片的异步下载和缓存

    "android图片的异步下载和缓存"这个主题涉及到如何高效、流畅地显示图片,避免阻塞UI线程,并且实现图片的本地缓存,提高用户体验。下面我们将详细探讨这两个核心概念。 1. **异步加载**: 在Android中,主线程...

    Android Google官网的图片缓存源码.rar

    "Android Google官网的图片缓存源码"是Google官方实现的图片缓存机制的源代码,对于深入理解Android图片加载和缓存机制有着极大的帮助。 首先,我们来讨论一下图片缓存的基本概念。缓存是一种存储机制,用于暂时...

    Android代码-图片缓存的一种方法

    我们一般将网络图片分为三个级别,第一级别是网络层,即根据图片的url地址可以找到服务器上相应图片,获取这一层的图片会消耗流量,所以我们希望可以获取后本地就永久使用,所以就会有接下来的缓存策略;第二层缓存...

    android从服务器端下载图片并保存在本地sdcard里并在界面滚动显示出来

    综上所述,"android从服务器端下载图片并保存在本地sdcard里并在界面滚动显示出来"这个过程涉及了网络请求、文件操作、图片缓存、异步处理、UI显示优化等多个技术点,需要综合运用多种Android开发技巧和第三方库。...

    Android之实现图片缓存、加载器功能源码.zip

    2. **节省流量和资源**:在网络不稳定或用户流量有限的情况下,缓存图片能保证图片正常显示。 3. **提高性能**:从本地缓存读取图片比从网络下载快得多,提升应用的响应速度。 **二、图片缓存的层次** Android图片...

    网络图片缓存实现

    在网络图片缓存中,当用户首次请求一张图片时,系统会从网络下载该图片并存储到本地(如SD卡),下次再次请求同一图片时,应用可以直接从本地缓存读取,而无需重新发起网络请求。 实现网络图片缓存主要涉及以下几个...

Global site tag (gtag.js) - Google Analytics