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包自己倒进工程就可以了