A. retrofit2缓存数据能缓存多久
有的可以清除,有的不可以清除,看是什么缓存数据,如果是这些的话随意都可以清除,如果是系统文件,则小心别删除错了!
B. 简单说下Retrofit怎么设置请求头信息
有三种方式:
1、直接在参数里写 每次访问的时候都要传入一下
@GET("weatherservice/citylist")
Observable<WeatherRestBean> queryWeather(@Header("apikey") String apikey,@Query("cityname") String cityname);
2、写到注解里这样就少了个参数,但是每定义个接口都要写一次也是比较麻烦
·
@Headers("apikey:")
@GET("weatherservice/cityid")
Observable<WeatherEntity> query(@Query("cityid")String cityid);
3、在创建Retrofit的时候添加,最方便的方式
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder1 = request.newBuilder();
Request build = builder1.addHeader("apikey", "ac7c302dc489a69082cbee6********").build();
return chain.proceed(build);
}
}).retryOnConnectionFailure(true)
.build();
mRetrofit = new Retrofit.Builder()
.client(client)
.baseUrl(ConstantApi.url)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
C. retrofit怎么本地缓存数据
首先是抽象的基类
public abstract class BaseApi {
public static final String API_SERVER = "服务器地址"
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
private static Retrofit mRetrofit;
protected static Retrofit getRetrofit() {
if (Retrofit == null) {
Context context = Application.getInstance().getApplicationContext();
//设定30秒超时
mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
//设置拦截器,以用于自定义Cookies的设置
mOkHttpClient.networkInterceptors()
.add(new CookiesInterceptor(context));
//设置缓存目录
File cacheDirectory = new File(context.getCacheDir()
.getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024);
mOkHttpClient.setCache(cache);
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服务器路径
.baseUrl(API_SERVER + "/")
//设置日期解析格式,这样可以直接解析Date类型
.setDateFormat("-MM-dd HH:mm:ss")
//配置转化库,默认是Gson
.addConverterFactory(ResponseConverterFactory.create())
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置OKHttpClient为网络客户端
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
然后是Cookies拦截器
public class CookiesInterceptor implements Interceptor{
private Context context;
public CookiesInterceptor(Context context) {
this.context = context;
}
//重写拦截方法,处理自定义的Cookies信息
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request compressedRequest = request.newBuilder()
.header("cookie", CookieUtil.getCookies(context))
.build();
Response response = chain.proceed(compressedRequest);
CookieUtil.saveCookies(response.headers(), context);
return response;
}
}123456789101112131415161718
CookieUtil则是一些自定义解析和生成方法以及SharedPreferences的存取,代码略
然后是Api类
public class UserApi extends BaseApi{
//定义接口
private interface UserService {
//GET注解不可用@FormUrlEncoded,要用@Query注解引入请求参数
@GET("user/user_queryProfile")
Observable<UserProfileResp> queryProfile(@Query("userId") int userId);
//POST方法没有缓存,适用于更新数据
@FormUrlEncoded
@POST("user/user_updateUserName")
Observable<BaseResp> updateUserName(@Field("userName") String userName);
}
protected static final UserService service = getRetrofit().create(UserService.class);
//查询用户信息接口
public static Observable<UserProfileResp> queryProfile(int userId){
return service.queryProfile(userId);
}
//更新用户名接口
public static Observable<BaseResp> updateUserName(String userName){
return service.updateUserName(userName);
}
}
再就是将Retrofit的响应消息经过Gson解析成期望的数据结构,称之为Model类
上文的BaseResp和UserProfileResp则是自定义的Model
假定服务器约定返回的Json格式为
{
"result":"结果代号,0表示成功",
"msg":"异常信息,仅在失败时返回数据",
"userInfo":
{
"id":"用户id",
"userName":"用户名名字"
}
}123456789
那么UserProfileResp可以写成
public class UserProfileResp {
//@SerializedName是指定Json格式中的Key名
//可以不写,则默认采用与变量名一样的Key名
@SerializedName("userInfo")
private UserProfileModel userInfo;
public UserProfileModel getUserInfo() {
return userInfo;
}
}12345678910
UserProfileModel则是具体的数据结构
public class UserProfileModel {
private int userId;
private String userName;
public String getUserName(){
return userName;
}
}12345678
需要注意的是,如果没有使用@SerializedName指定Key名,当工程被混淆时,变量名会被混淆得与期望的Key名不符。因此需要将这类Model类统一放到一个工程目录,再在proguard-project文件中加入排除项
//不混淆Model类
-keep class com.xxx.model.xxx.** { *; }12
最后是实际调用
public void getProfile(int userId){
UserApi.queryProfile(userId)
.subscribeOn(Schelers.io())
.subscribe(new Subscriber<UserProfileResp>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserProfileResp userProfileResp) {
}
});
}
D. android rxjava retrofit 怎么设置本地缓存
android:layout_width="142dp" android:layout_height="36dp" 修改imagebutton上面两个属性就可以了
E. retrofit怎么本地缓存数据,下次进来先显示缓存
直接删掉。在看看设置里有目录信息,找到kankan目录,可以直接删除
F. retrofit和okhttp的区别
;//短缓存有效期为1秒钟publicstaticfinalintCACHE_STALE_SHORT=1;//长缓存有效期为7天publicstaticfinalintCACHE_STALE_LONG=60*60*24*7;privateMyRetrofitManager(){initOkHttpClient();Retrofitretrofit=newRetrofit.Builder().baseUrl(BASE_NIUPAI_URL).client(mOkHttpClient).addCallAdapterFactory(RxJavaCallAdapterFactory.create())//.addConverterFactory(newMyCustomFactory()).addConverterFactory(GsonConverterFactory.create()).build();mJtmlService=retrofit.create(JtmlServer.class);}privatevoidinitOkHttpClient(){=newHttpLoggingInterceptor();interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);if(mOkHttpClient==null){synchronized(MyRetrofitManager.class){if(mOkHttpClient==null){//指定缓存路径,缓存大小100MbCachecache=newCache(newFile(App.getContext()。getCacheDir(),"HttpCache"),1024*1024*100);mOkHttpClient=newOkHttpClient.Builder().cache(cache).addInterceptor().addNetworkInterceptor().addInterceptor(interceptor).retryOnConnectionFailure(true).connectTimeout(15,TimeUnit.SECONDS).build();}}}