Skip to content

Commit

Permalink
add http cache,update version 0.1.9 to 0.2.9
Browse files Browse the repository at this point in the history
  • Loading branch information
open-android committed Dec 16, 2016
1 parent 67284de commit 0fe9e1b
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 7 deletions.
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ allprojects {

在build.gradle添加依赖
```xml
compile 'com.github.open-android:RetrofitUtils:0.1.9'
compile 'com.github.open-android:RetrofitUtils:0.2.9'
```

###需要的权限
Expand All @@ -34,6 +34,11 @@ retrofitUtils初始化需要二个参数Context、baseUrl,最好在Application
ItheimaHttp.init(this, baseUrl);//baseUrl格式:"http://xxxxxx/xxxxx/"
```

###设置是否缓存http响应数据(默认支持缓存)
```java
ItheimaHttp.setHttpCache(false);//false不缓存,true缓存
```

###get/Post Bean类型异步请求(内部使用Gson解析json数据)
```java
//ItheimaHttp.newPostRequest(apiUrl)
Expand Down
117 changes: 111 additions & 6 deletions retrofitutils/src/main/java/com/itheima/retrofitutils/HttpHelper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.itheima.retrofitutils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.TextUtils;

import com.google.gson.Gson;
Expand All @@ -8,10 +11,16 @@

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
Expand All @@ -35,25 +44,75 @@
*/

public final class HttpHelper {
private volatile static WeakReference<HttpHelper> sInstance;
private final Retrofit mRetrofit;
private static WeakReference<HttpHelper> sInstance;
private volatile Retrofit mRetrofit;

private static String sBaseUrl;

private File mCacheFile;
private ConnectivityManager mCm;
//默认支持http缓存
private static boolean mIsCache = true;

public static void setBaseUrl(String baseUrl) {
sBaseUrl = baseUrl;
}

/**
* 设置是否缓存http请求数据
*
* @param isCache
*/
public static void setHttpCache(boolean isCache) {
mIsCache = isCache;
}


public static String getBaseUrl() {
return sBaseUrl;
}

private HttpHelper() {
Retrofit.Builder builder = new Retrofit.Builder();
if (TextUtils.isEmpty(getBaseUrl())) {
throw new NullPointerException("init(Context,httpBaseUrl):httpBaseUrl is not null");
OkHttpClient okHttpClient = createOkhttpAndCache();
mRetrofit = new Retrofit.Builder()
.baseUrl(sBaseUrl)
.client(okHttpClient)
.addConverterFactory(StringConverterFactory.create())
//.addConverterFactory(GsonConverterFactory.create())
.build();
//缓存路径
mCacheFile = new File(ItheimaHttp.getContext().getCacheDir().getAbsolutePath() + File.separator + "retrofit2_http_cache");
//判断缓存路径是否存在
if (!mCacheFile.exists() && !mCacheFile.isDirectory()) {
mCacheFile.mkdir();
}

}

/**
* 创建okhttp & 添加缓存
*
* @return
*/
private OkHttpClient createOkhttpAndCache() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (mIsCache) {
//http缓存大小10M
Cache cache = new Cache(mCacheFile, 1024 * 1024 * 10);
//添加网络过滤 & 实现网络数据缓存
Interceptor interceptor = createHttpInterceptor();
builder.addNetworkInterceptor(interceptor);
builder.addInterceptor(interceptor);
//给okhttp添加缓存
builder.cache(cache);
}
mRetrofit = builder.baseUrl(getBaseUrl()).build();
//设置超时
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//错误重连
builder.retryOnConnectionFailure(true);
return builder.build();
}

public static HttpHelper getInstance() {
Expand Down Expand Up @@ -182,6 +241,52 @@ public void onFailure(Call<ResponseBody> call, Throwable t) {
});
}

/**
* 创建网络过滤对象,添加缓存
*
* @return
*/
private Interceptor createHttpInterceptor() {
return new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
okhttp3.Request request = chain.request();

//获取网络状态
if (mCm == null) {
mCm = (ConnectivityManager) ItheimaHttp.getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
}
NetworkInfo networkInfo = mCm.getActiveNetworkInfo();
boolean isNetwork = (networkInfo != null && networkInfo.isConnected());

//没有网络情况下,仅仅使用缓存(CacheControl.FORCE_CACHE;)
if (!isNetwork) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
okhttp3.Response response = chain.proceed(request);
if (isNetwork) {
int maxAge = 0;
// 有网络时, 不缓存, 最大保存时长为0
response.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.removeHeader("Pragma")
.build();
} else {
// 无网络时,设置超时为4周
int maxStale = 60 * 60 * 24 * 28;
response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.removeHeader("Pragma")
.build();
}
return response;
}
};
}


public static interface HttpService<T> {
@GET
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.itheima.retrofitutils;

import android.app.Application;
import android.content.Context;

import com.itheima.retrofitutils.listener.HttpResponseListener;
Expand All @@ -13,7 +14,18 @@

public class ItheimaHttp {

private static Context mContext;

public static Context getContext() {
return mContext;
}

public static void setHttpCache(boolean cache){
HttpHelper.setHttpCache(cache);
}

public static final void init(Context context, String httpBaseUrl) {
mContext = context.getApplicationContext();
HttpHelper.setBaseUrl(httpBaseUrl);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.itheima.retrofitutils;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public final class StringConverterFactory extends Converter.Factory {

public static final StringConverterFactory INSTANCE = new StringConverterFactory();

public static StringConverterFactory create() {
return INSTANCE;
}

// 我们只关实现从ResponseBody 到 String 的转换,所以其它方法可不覆盖
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (type == String.class) {
return StringConverter.INSTANCE;
}
//其它类型我们不处理,返回null就行
return super.responseBodyConverter(type, annotations, retrofit);
}
}

class StringConverter implements Converter<ResponseBody, String> {

public static final StringConverter INSTANCE = new StringConverter();

@Override
public String convert(ResponseBody value) throws IOException {
return value.string();
}
}

0 comments on commit 0fe9e1b

Please sign in to comment.