當前位置:首頁 » 硬碟大全 » retrofit怎麼本地緩存
擴展閱讀
蘋果12錄音存儲容量設置 2022-07-07 01:24:03
mongodb命令行刪除資料庫 2022-07-07 01:21:14
椰蓉巧克力棒能存儲多久 2022-07-07 01:17:23

retrofit怎麼本地緩存

發布時間: 2022-06-23 18:25:43

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();}}}