最近又开始看App 研发录,每次看都会有豁然开朗的感觉,也许是糟心的代码看的有点多。
这个MockService 就是一个模拟网络获取数据的接口,不用每次都在等着api接口写完才能写具体的流程业务
public abstract class MockService {
public abstract String getJsonData();
public BaseResponse getSuccessResponse() {
BaseResponse response = new BaseResponse();
response.setError(false);
response.setErrorType(0);
response.setErrorMessage("");
return response;
}
public BaseResponse getFailResponse(int errorType, String errorMessage) {
BaseResponse response = new BaseResponse();
response.setError(true);
response.setErrorType(errorType);
response.setErrorMessage(errorMessage);
return response;
}
}
因为小公司不用自己写网络请求库,而且现在流行 retrofit +rxJava,所以对原文中的代码做了下改变,
public class MockIntercepter implements Interceptor {
private Gson mGson;
public MockIntercepter() {
mGson = new Gson();
}
@Override
public Response intercept(Chain chain) throws IOException {
Response.Builder responseBuilder = new Response.Builder()
.code(200).message("").request(chain.request()).
protocol(Protocol.HTTP_1_1).
addHeader("content-type", "application/json");
Request request = chain.request();
String requestUrl = request.url().toString();
String apiKey = requestUrl.substring(requestUrl.lastIndexOf("/"));
if(apiKey.contains("?")){
apiKey = apiKey.substring(1,apiKey.indexOf("?"));
}
URLData urlData = UrlConfigManager.findURL(apiKey);
if (urlData != null) {
try {
MockService mockService = (MockService) Class.forName(
urlData.getMockClass()).newInstance();
String strResponse = mockService.getJsonData();
responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), strResponse.getBytes()));
return responseBuilder.build();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return chain.proceed(request);
}
}
Url 读取和配置用已有的就行了
<?xml version="1.0" encoding="utf-8"?>
<url>
<Node
Expires="300"
Key="getBannerList"
MockClass="com.demo.MockMainBannerList"
NetType="get" />
</url>
然后封装的时候把MockIntercepter 加到 okhttp 里面就好了
private OkHttpClient initOkHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
//添加日志
if (Utils.isAppDebug()) {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(httpLoggingInterceptor);
//mock data
builder.addInterceptor(new MockIntercepter());
}
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.writeTimeout(10, TimeUnit.SECONDS);
builder.readTimeout(10, TimeUnit.SECONDS);
//添加缓存拦截器
CacheInterceptor cacheInterceptor = new CacheInterceptor();
builder.addInterceptor(cacheInterceptor);
builder.addNetworkInterceptor(cacheInterceptor);
return builder.build();
}
/**
* http交互处理类
* Created by WZG on 2016/7/16.
*/
public class HttpManager {
/*软引用對象*/
private SoftReference<LifecycleProvider> mLifecycleProvider;
public HttpManager(LifecycleProvider lifecycleProvider) {
this.mLifecycleProvider = new SoftReference(lifecycleProvider);
}
/**
* 处理http请求
*
* @param observable 封装的请求数据
*/
public Observable doHttpDeal(Observable observable) {
/*rx处理*/
return observable
/*失败后的retry配置*/
.retryWhen(new RetryWhenNetworkException())
/*异常处理*/
.onErrorResumeNext(funcException)
/*生命周期管理*/
.compose(mLifecycleProvider.get().bindToLifecycle())
/*http请求线程*/
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
/*回调线程*/
.observeOn(AndroidSchedulers.mainThread());
/*结果判断*/
}
/**
* 异常处理
*/
Function funcException = (Function<Throwable, Observable>) throwable ->
Observable.error(FactoryException.analysisExcetpion(throwable));
}