android实现服务器图片本地缓存
2013-05-25 21:28
281 查看
<p>情况:在做ostocy-jshop开源系统的时候,需要做一个关于android如何进行服务器图片本地缓存的功能。我使用了如下几个东西。</p>
<p> </p>
<p>1,android 本地数据库SQLite</p>
<p> 2,android下载网络图片</p>
<p>3,正则截取</p>
<p>4,Bitmap保存到本地</p>
<p> </p>
<p>那就一个一个来说说吧</p>
<p> </p>
<p>1,android 本地数据库SQLite:我要建立一个本地数据库,用来存放服务器返回的数据,缓存起来,下次就读取这个SQLite数据库了。</p>
<p> </p>
<p>看代码先,然后解释</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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);
}
}</pre>
<p> 这里主要就是在建立数据表,抽取了一部分代码。</p>
<p> </p>
<p>2,android下载网络图片:我通过android访问基于http的服务器方法,获取一个有图片的信息。</p>
<p> </p>
<p>看代码</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> </p>
<p>3,正则截取</p>
<p> </p>
<p> </p>
<pre name="code" class="java">/**
* 获取网络图片名称
*
* @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;
}</pre>
<p> </p>
<p>4,Bitmap保存到本地</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> </p>
<p>详情请见<a href="https://github.com/sdywcd/ostocy-jshop">https://github.com/sdywcd/ostocy-jshop</a> 开源项目</p>
<p> </p>
<p> </p>
<p>1,android 本地数据库SQLite</p>
<p> 2,android下载网络图片</p>
<p>3,正则截取</p>
<p>4,Bitmap保存到本地</p>
<p> </p>
<p>那就一个一个来说说吧</p>
<p> </p>
<p>1,android 本地数据库SQLite:我要建立一个本地数据库,用来存放服务器返回的数据,缓存起来,下次就读取这个SQLite数据库了。</p>
<p> </p>
<p>看代码先,然后解释</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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);
}
}</pre>
<p> 这里主要就是在建立数据表,抽取了一部分代码。</p>
<p> </p>
<p>2,android下载网络图片:我通过android访问基于http的服务器方法,获取一个有图片的信息。</p>
<p> </p>
<p>看代码</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> </p>
<p>3,正则截取</p>
<p> </p>
<p> </p>
<pre name="code" class="java">/**
* 获取网络图片名称
*
* @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;
}</pre>
<p> </p>
<p>4,Bitmap保存到本地</p>
<p> </p>
<p> </p>
<pre name="code" class="java">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;
}</pre>
<p> </p>
<p>详情请见<a href="https://github.com/sdywcd/ostocy-jshop">https://github.com/sdywcd/ostocy-jshop</a> 开源项目</p>
<p> </p>
相关文章推荐
- Android客户端读取PHP服务器的图片等信息,并用ListView列出来,实现缓存功能。
- Android本地缓存和远程图片获取的实现
- Android实现图片异步加载及本地缓存
- Android本地缓存和远程图片获取的实现
- android 加载图片本地有缓存,如何实时更新服务器上修改的图片
- android异步加载图片并缓存到本地实现方法
- android异步加载图片并缓存到本地实现方法
- android异步加载图片并缓存到本地实现方法
- [置顶] Android开发之下载服务器上的一张图片到本地java代码实现HttpURLConnection
- android异步加载图片并缓存到本地实现方法
- 图片、缓存-Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)-by小雨
- Android:ListView异步加载图片(实现网络下载、存储本地、缓存内存、压缩显示)
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android开发之下载服务器上的一张图片到本地java代码实现HttpURLConnection
- android异步加载图片并缓存到本地实现方法
- Android实现图片异步加载并缓存到本地
- Android图片异步加载与本地缓存的实现
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)