Retrofit2.0在android项目中的使用
来源:互联网 发布:无线直发器淘宝 编辑:程序博客网 时间:2024/04/28 08:22
Retrofit2.0github官方文档
Retrofit2.0简介:
Retrofit2.0是Square公司出品的针对于Android和Java的类型安全的Http客户端,网络请求是基于OkHttp.
Retrofit2.0的改进
Retrofit2.0的使用:
下载jar包
Gradle:配置:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
用法介绍:
创建接口 NetworkService.java
Public Interface NetworkService{
/** * 获取码表数据 * @param info * @return */ @POST("getCodeList") Call<CodeListResponse> getCodeList(@Body EncryptUpload info) ;
}
创建ApiService.javapublic class ApiService { private Retrofit retrofit ; private static NetworkService networkService ; private static ApiService ourInstance ; public static ApiService getInstance() { if (ourInstance==null) { ourInstance = new ApiService(); } return ourInstance; } private ApiService() { retrofit= RetrofitManager.builder(); networkService= retrofit.create(NetworkService.class); } /*** * 获取码表数据 */ public void getCodeList(JSONObject json, Callback callback){ EncryptUpload encryptUpload = toEncry(json,"getCodeList"); Call<CodeListResponse> call = networkService.getCodeList(encryptUpload); call.enqueue(callback); }
}在外部调用:
private void getCodeList(){ if (AppConfig.IS_OFFLINE) return; JSONObject jsonObject = new JSONObject(); String lastUpdateTime = PreferenceUtil.getStringData(this, AppConfig.PRE_CODE_LATEST_UPDATED_TIME); try { jsonObject.put("lastUpdateTime",lastUpdateTime); ApiService.getInstance().getCodeList(jsonObject, new Callback<CodeListResponse>() { @Override public void onResponse(Call<CodeListResponse> call, Response<CodeListResponse> response) { if (!response.isSuccessful()){ ToastUtil.show(getBaseContext(),"请求异常"); return; } if(AppConfig.handleResponse(MainActivity.this,(BaseResponse)response.body())){ List<CodeList> addList =response.body().getAddList(); List<CodeList> updateList =response.body().getUpdateList(); List<Integer> deleteList =response.body().getDeleteList(); try { //模板 更新 if (addList!=null&&addList.size()>0) CreditApplication.getDbManager().saveOrUpdate(addList); if (updateList!=null&&updateList.size()>0) CreditApplication.getDbManager().saveOrUpdate(updateList); if (deleteList!=null&&deleteList.size()>0) CreditApplication.getDbManager().deleteById(CodeList.class,deleteList); //时间 更新 PreferenceUtil.setStringData(getBaseContext(), AppConfig.PRE_CODE_LATEST_UPDATED_TIME,response.body().getLastUpdateTime()); } catch (DbException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<CodeListResponse> call, Throwable t) { } }); } catch (JSONException e) { e.printStackTrace(); } }
RetrofitManager.java
import com.psbc.credit.AppConfig;import com.psbc.credit.CreditApplication;import com.psbc.credit.util.NetworkUtil;import java.io.File;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.Cache;import okhttp3.CacheControl;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by rance on 2016/11/10. */public class RetrofitManager { //短缓存有效期为1分钟 public static final int CACHE_STALE_SHORT = 60; //长缓存有效期为7天 public static final int CACHE_STALE_LONG = 60 * 60 * 24 * 7; public static final String CACHE_CONTROL_AGE = "Cache-Control: public, max-age="; //查询缓存的Cache-Control设置,为if-only-cache时只查询缓存而不会请求服务器,max-stale可以配合设置缓存失效时间 public static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_LONG; //查询网络的Cache-Control设置,头部Cache-Control设为max-age=0时则不会使用缓存而请求服务器 public static final String CACHE_CONTROL_NETWORK = "max-age=0"; private static OkHttpClient mOkHttpClient; private static Retrofit retrofit; public static Retrofit builder(){ return new RetrofitManager().retrofit; } private RetrofitManager() { initOkHttpClient(); retrofit = new Retrofit.Builder() .baseUrl(AppConfig.HOST_URL) .client(mOkHttpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } private void initOkHttpClient() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); if (mOkHttpClient == null) { synchronized (RetrofitManager.class) { if (mOkHttpClient == null) { // 指定缓存路径,缓存大小100Mb Cache cache = new Cache(new File(CreditApplication.getContext().getCacheDir(), "HttpCache"), 1024 * 1024 * 100); mOkHttpClient = new OkHttpClient.Builder() .cache(cache) .addInterceptor(mRewriteCacheControlInterceptor) .addNetworkInterceptor(mRewriteCacheControlInterceptor) .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(60,TimeUnit.SECONDS) .writeTimeout(60,TimeUnit.SECONDS) .build(); } } } } // 云端响应头拦截器,用来配置缓存策略 private Interceptor mRewriteCacheControlInterceptor = new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!NetworkUtil.isNetworkConnected()) { request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build(); } okhttp3.Response originalResponse = chain.proceed(request); if (NetworkUtil.isNetworkConnected()) { //有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置 String cacheControl = request.cacheControl().toString(); return originalResponse.newBuilder().header("Cache-Control", cacheControl) .removeHeader("Pragma").build(); } else { return originalResponse.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_LONG) .removeHeader("Pragma").build(); } } };}
个人使用到其他相关jar包:
okhttp与okio.zip(内包含两个jar包) okio-1.8.0.jar okhttp-3.3.1.jar
gson-2.7.jar
retrofit-2.1.0.jar
1 0
- Retrofit2.0在android项目中的使用
- retrofit2 RxJava在android中的使用
- Retrofit2结合Picasso在项目当中的简单使用
- android retrofit2.0框架的使用介绍
- Android Retrofit2 简单使用
- Android Retrofit2的使用
- Android Retrofit2使用
- Breakpad 在 Cocos Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- MVP模式在Android项目中的使用
- Iconfont 图标库在Android项目中的使用
- GreenDao在Android项目开发中的使用
- MVP模式在Android项目中的使用
- IE6兼容性问题及解决办法汇总
- JS 动态添加、删除表格的行
- SVM 多分类 -SVM分类opencv3.0源代码
- python 读写 json 解析
- Git基础 3 —— 分支
- Retrofit2.0在android项目中的使用
- 管理SQL Server AlwaysOn(5)——常规监控(1)——常规监控
- 为什么数据要取对数
- maven项目修改项目名称,修改文件目录
- easymock快速入门
- 关于新浪微博粉丝关注分享消息队列等架构的调研资料
- 单元测试代码
- 点、线导出含高程值的表格
- 给调度器上锁和开锁(Locking and UnLocking the Scheduler)