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);
原文地址:https://www.cnblogs.com/lsfv/p/9907427.html