cathome 猫家 开发日记- 第三方库, http 请求与json.以及图片缓存
http 概述。
1.http请求,一般采用异步。所以必须是新线程。新线程获得数据一般是要修改界面。所以新线程一般是获得数据就结束,向主线程插入任务,让主线程处理。
2.http一般含有get和post。
3.所以可以使用方便一点的第三方库。最好是获得数据后。已处理转到主线程的步骤, 最耗时的网络操作在新线程处理。其他操作全部在主线程处理。基本没有什么问题。满足90%的库就是好库。10%需要特殊处理耗时操作。自行开新线程就可以。
4.所以,使用地三方库。自己稍微封装下。就ok。、json。使用alibaba 的fastjson.
5.异步,天生 需要委托 。 看下流程。
json库概述
1.使用alibaba 的fastjson.
主要是简洁,如
String jsonValue=LSJsonHelper.GetFirstValue(abc);
List<Comment> ret=JSON.parseArray(jsonValue,Comment.class );
图片缓存概述
1.图片感觉就没有必要缓存到内存了。文件和图片,稍大的感觉都没有必要放入到内存。放到卡中就好了。 常用的特殊除外。内存放些常用数据比较好。
2,使用了universalimageloader 这个库。
3.使用步骤为
3.1配置imageloader ,感觉是基础配置,这个时候缓存并不会自动起作用好像。
3.2p配置 displayoption 。好像是配置了这个之后,当对某张图片插入这个参数的时候。缓存才会起作用。
1.使用第三方库后,自己的封装类里面: handle.OnSuccess(body); <已经在主线程里面了>
2. 调用类库的通用类: mHttpHelper.HttpPost(GlobalVariable.ws_comment_get, tt,handle);
3.最终调用代码:dalCatDetail.Add_Comment(comment, cid, uid, nickname, new LSHttpRequestHelper.OnSuccessHandle()
自己封装类
package com.utils.IO; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import java.nio.charset.StandardCharsets; import java.util.Map; import cz.msebera.android.httpclient.Header; public class LSHttpRequestHelper { AsyncHttpClient httpClient = new AsyncHttpClient(); public interface OnSuccessHandle { public void OnSuccess(String abc); } public void HttpGet(String url, final OnSuccessHandle handle) { httpClient.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if(statusCode==200) { String body = new java.lang.String(responseBody);//????2nd:"utf-8" handle.OnSuccess(body); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } }); } public void HttpPost(String url, Map<String, String> params,final OnSuccessHandle handle) { RequestParams pa=new RequestParams(params); httpClient.post(url, pa, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if(statusCode==200) { String body = new java.lang.String(responseBody);//????2nd:"utf-8" handle.OnSuccess(body); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } }); } }
数据访问类
public void GetComments(int catid,LSHttpRequestHelper.OnSuccessHandle handle) { Map<String,String> tt=new HashMap<>(); tt.put("catid", catid+""); mHttpHelper.HttpPost(GlobalVariable.ws_comment_get, tt,handle); }
调用
private void SetupListview() { dalCatDetail.GetComments(mbase.Base_ID, new LSHttpRequestHelper.OnSuccessHandle() { @Override public void OnSuccess(String abc) { String jsonValue=LSJsonHelper.GetFirstValue(abc); List<Comment> ret=JSON.parseArray(jsonValue,Comment.class ); madapter=new CommentAdapter(getContext(), ret); mlv.setAdapter(madapter); } }); }
图片库的使用。
配置
//初始化第三方库-图片库 File cacheDir = StorageUtils.getCacheDirectory(this); //ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this); ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(this); builder.threadPoolSize(3); // 线程池大小 builder.threadPriority(Thread.NORM_PRIORITY - 2); // 设置线程优先级 builder.denyCacheImageMultipleSizesInMemory(); // 不允许在内存中缓存同一张图片的多个尺寸 builder.tasksProcessingOrder(QueueProcessingType.LIFO); // 设置处理队列的类型,包括LIFO, FIFO builder.memoryCache(new LruMemoryCache(3 * 1024 * 1024)); // 内存缓存策略 builder.memoryCacheSize(5 * 1024 * 1024); // 内存缓存大小 builder.memoryCacheExtraOptions(480, 800); // 内存缓存中每个图片的最大宽高 builder.memoryCacheSizePercentage(50); // 内存缓存占总内存的百分比 builder.diskCache(new UnlimitedDiskCache(cacheDir)); // 设置磁盘缓存策略 builder.diskCacheSize(50 * 1024 * 1024); // 设置磁盘缓存的大小 builder.diskCacheFileCount(50); // 磁盘缓存文件数量 builder.diskCacheFileNameGenerator(new Md5FileNameGenerator()); // 磁盘缓存时图片名称加密方式 builder.imageDownloader(new BaseImageDownloader(this)); // 图片下载器 builder.defaultDisplayImageOptions(DisplayImageOptions.createSimple()); builder.writeDebugLogs(); // 打印日志 ImageLoader.getInstance().init(builder.build()); DisplayImageOptions options; GlobalVariable.picconfig = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.pic1) //设置图片在下载期间显示的图片 .showImageForEmptyUri(R.drawable.pic1)//设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.pic1) //设置图片加载/解码过程中错误时候显示的图片 //.cacheInMemory(true)//设置下载的图片是否缓存在内存中 //.cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中 .cacheOnDisk(true) .considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型// //.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间 //设置图片加入缓存前,对bitmap进行设置 //.preProcessor(BitmapProcessor preProcessor) .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位 //.displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少 .build();//构建完成
最简单的使用,一条语句,带缓存
ImageLoader.getInstance().displayImage(GlobalVariable.ws_pic+"head/1.png", ivhead,GlobalVariable.picconfig);