OkHttp网络解析工具类

package com.bwie.zhangtianchengyunifang.BaseDataDemo;

import android.text.TextUtils;
import android.util.Log;

import com.bwie.zhangtianchengyunifang.Utils.CommonUtils;
import com.bwie.zhangtianchengyunifang.Utils.MD5Encoder;
import com.bwie.zhangtianchengyunifang.ViewDemo.ShowingPage;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;

/**
 * Created by lwj on 2016/11/29.
 */
public abstract class BaseData {

    private final File file;
    public static final int NOTIME = 0;
    public static final int NORMALTIME = 3 * 24 * 60 * 60 * 1000;
    public String data;

    public BaseData() {
        //找到缓存路径
        File cacheDir = CommonUtils.getContext().getCacheDir();
        //给他指定一个存储路径
        file = new File(cacheDir, "yunifang");
        //进行判断
        if (!file.exists()) {
            //如果不是文件夹就新创建一个
            file.mkdir();
        }
    }
    //path 路径,args请求参数,indesx 索引, vatime 有效时间

    public void getData(String path, String args, int index, int vatime) {
        //如果有效时间为0那么表示为直接访问网络
        if (vatime == 0) {
            getDataFromNet(path, args, index, vatime);
        } else {
            //fouze从本地读取
            String data = getDataFromLocal(path, index, vatime);
            Log.i("TAG", "getData: ----------" + data);
            if (TextUtils.isEmpty(data)) {
                //如果为空,请求网络
                getDataFromNet(path, args, index, vatime);
            } else {
                //拿到了数据,返回数据
                setResultData(data);
            }

        }
    }

    //从本地读取
    private String getDataFromLocal(String path, int index, int vatime) {
        //读取文件信息
        try {
            File read_file = new File(file, MD5Encoder.encode(path) + index);
            BufferedReader bufferedReader = new BufferedReader(new FileReader(read_file));
            //先读取第一行的时间
            String s = bufferedReader.readLine();
            //强转为long类型
            long time = Long.parseLong(s);
            //和当前时间进行比较
            if (System.currentTimeMillis() - time < vatime) {
                //将信息读出来
                StringBuilder builder = new StringBuilder();
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    builder.append(line);
                }
                bufferedReader.close();
                return builder.toString();
            } else {
                //无效
                return null;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //从网络读取
    private void getDataFromNet(final String path, final String args, final int index, final int vatime) {
        //创建okHttpClient对象
        OkHttpClient mOkHttpClient = new OkHttpClient();
        //创建一个Request
        final Request request = new Request.Builder()
                .url(path + "?" + args)
                .build();
        //new call
        Call call = mOkHttpClient.newCall(request);
        //请求加入调度
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
            }

            @Override
            public void onResponse(final Response response) throws IOException {
                final String data = response.body().string();
                Log.i("TAG", "response: ----------"+data);
                CommonUtils.runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
                        //设置数据
                        setResultData(data);
                    }
                });

                //写到本地
                writeDataToLocal(path, args, index, vatime, data);


            }
        });

    }

    /**
     * @param path      请求地址
     * @param index     页码索引
     * @param validTime 有效时间
     */
    public void postData(String path, HashMap<String, String> argsMap, int index, int validTime) {
        //先判断有效时间
        if (validTime == 0) {
            //直接请求网络,要最新数据
            postDataFromNet(path, argsMap, index, validTime);
        } else {
            //从本地获取
            String data = getDataFromLocal(path, index, validTime);
            if (TextUtils.isEmpty(data)) {
                //如果为空,请求网络
                postDataFromNet(path, argsMap, index, validTime);
            } else {
                //拿到了数据,返回数据
                setResultData(data);
            }
        }
    }

    private void postDataFromNet(String path, HashMap<String, String> argsMap, int index, int validTime) {
        //将Map中的参数取出
        Set<String> strings = argsMap.keySet();
        FormEncodingBuilder formEncodingBuilder = new FormEncodingBuilder();
        for (String key : strings
                ) {
            formEncodingBuilder.add(key, argsMap.get(key));
        }
        //创建client对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //创建body
        RequestBody requestBody = formEncodingBuilder.build();
        //创建一个post请求
        Request request = new Request.Builder()
                .url(path)
                .post(requestBody)
                .build();
        //new call
        Call call = okHttpClient.newCall(request);
        //请求加入调度
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                //设置error
                setResulttError(ShowingPage.StateType.STATE_LOAD_ERROR);
            }

            @Override
            public void onResponse(final Response response) throws IOException {
                final String data = response.body().string();
                CommonUtils.runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
                        //设置数据
                        setResultData(data);
                    }
                });
            }
        });


    }


    public abstract void setResultData(String data);

    protected abstract void setResulttError(ShowingPage.StateType stateLoadError);

    //请求网络后将读取的信息写入本地
    private void writeDataToLocal(String path, String args, int index, int vatime, String data) {
        try {
            //每一个请求都会生成一个文件
            File write_file = new File(file, MD5Encoder.encode(path) + index);
            //写流信息
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(write_file));

            //从网络上请求的数据
            bufferedWriter.write(data);
            //关闭流
            bufferedWriter.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

需要在bulder里面设置: compile 'com.squareup.okhttp:okhttp:2.4.0'

可以把上面代码写一个工具类:BaseData类但他需要几个辅助类可以把下面的类写成CommonUtils类

package com.bwie.zhangtianchengyunifang.Utils;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.View;

import com.bwie.zhangtianchengyunifang.Application.MyApplication;

public class CommonUtils {
    public static Context getContext() {
        return MyApplication.getContext();
    }

    public static Handler getHandler() {
        return MyApplication.getHandler();
    }

    public static Thread getMainThread() {
        return MyApplication.getMainThread();
    }

    public static int getMainThreadId() {
        return MyApplication.getMainThreadId();
    }

    // 获取资源文件夹操作
    public static Resources getResources() {
        return getContext().getResources();
    }

    // string文件中的字符串
    public static String getString(int stringId) {
        return getResources().getString(stringId);
    }

    // 返回drawable操作
    public static Drawable getDrawable(int drawableId) {
        return getResources().getDrawable(drawableId);
    }

    // string-array
//    public static String[] getStringArray(int arrayId) {
//        return getResources().getStringArray(arrayId);
//    }

    // 颜色选择通过资源文件获取

    // dip--->px, 1dp = 2px,定义一个控件的宽高 layoutParams(w,h)
    public static int dip2px(int dip) {
        // 获取dp和px的转换关系的变量
        float density = getResources().getDisplayMetrics().density;
        return (int) (dip * density + 0.5);
    }

    // px---->dp
    public static int px2dip(int px) {
        float density = getResources().getDisplayMetrics().density;
        return (int) (px / density + 0.5);
    }

    // 判断当前线程是否在主线程中
    public static boolean isRunInMainThread() {
        //先获取主线程的线程号然后和当前线程号比较
        return getMainThreadId() == android.os.Process.myTid();
    }

    // 区分是否在 主线程中,做UI处理
    public static void runOnMainThread(Runnable runnable) {
        if (isRunInMainThread()) {
            // 如果当前任务就在主线程中,直接运行
            runnable.run();
        } else {
            // 如果当任务在子线程中,则将其传递到主线程中去执行
            getHandler().post(runnable);
        }
    }

//    // 根据id获取颜色选择器xml
//    public static ColorStateList getColorStateList(int mTabTextColorResId) {
//        return getResources().getColorStateList(mTabTextColorResId);
//    }

    public static View inflate(int layoutId) {
        return View.inflate(getContext(), layoutId, null);
    }

    // 将dimens中的dp转换成像素值
    public static int getDimens(int dimensId) {
        return getResources().getDimensionPixelSize(dimensId);
    }

    public static void postDelayed(Runnable runnable, int delayed) {
        // 延时做任务方法
        getHandler().postDelayed(runnable, delayed);
    }

    // 移除指定任务的操作
    public static void removeCallBack(Runnable runnable) {
        getHandler().removeCallbacks(runnable);
    }
}

还需要一些基础的Application里面的一些初始化配置主要要注意的是在清单文件里记得写name

package com.bwie.zhangtianchengyunifang.Application;

import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Process;

import com.bwie.zhangtianchengyunifang.Utils.ImageLoaderUtils;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
import com.zhy.autolayout.config.AutoLayoutConifg;

import org.xutils.x;

/**
 * Created by lwj on 2016/11/28.
 */
public class MyApplication extends Application {

    private static Context context;
    private static Handler handler;
    private static int mainThreadId;

    @Override
    public void onCreate() {
        //上下文对象
        context = getApplicationContext();
        //ImageLoaderUtils的初始化
        ImageLoaderUtils.initConfiguration(getContext());
        //xutils的初始化工作
        x.Ext.init(this);
        x.Ext.setDebug(true);
        //获取主线程的线程号
        mainThreadId = Process.myTid();

        handler = new Handler();
        AutoLayoutConifg.getInstance().useDeviceSize();
        PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
        UMShareAPI.get(this);
        super.onCreate();

    }

    public static Context getContext() {
        return context;
    }

    public static Handler getHandler() {
        return handler;
    }

    public static int getMainThreadId() {
        return mainThreadId;
    }

    public static Thread getMainThread() {
        return Thread.currentThread();
    }
}

一些jar包自己倒进工程就可以了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值