```
public class RetrofitUtil {
private static finalStringTAG="retrofit";
//TODO:修改主機(jī)地址
private static finalStringBASE_URL="服務(wù)器地址/";
private static final intDEFAULT_TIMEOUT=5;//請求時間
private staticRetrofitretrofit;
//實(shí)例化私有
privateWeiYunRetrofitUtil() {
}
public staticRetrofit getInstance() {
if(retrofit==null) {
ClearableCookieJar cookieJar =
newPersistentCookieJar(newSetCookieCache(),newSharedPrefsCookiePersistor(App.getInstance()));
OkHttpClient.Builder httpClientBuilder =newOkHttpClient.Builder();//okhttp創(chuàng)建主儡,寫入緩存機(jī)制蕴轨,還有addInterceptor
httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
File cacheFile =newFile(App.getInstance().getCacheDir(),"superman");
Cache cache =newCache(cacheFile,1024*1024*100);//100Mb
httpClientBuilder.cache(cache);
httpClientBuilder.cookieJar(cookieJar);
httpClientBuilder.addInterceptor(LoggingInterceptor);
httpClientBuilder.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR);
httpClientBuilder.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR);
return newRetrofit.Builder()//retrofit的創(chuàng)建圣勒。
.client(httpClientBuilder.build())
//傳入okhttp
.addConverterFactory(newNullOnEmptyConverterFactory())
.addConverterFactory(GsonConverterFactory.create())//傳入gson解析手段
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//傳入異步手段
.baseUrl(BASE_URL)//傳入服務(wù)器地址
.build();
}else{
returnretrofit;
}
}
private static finalInterceptorLoggingInterceptor=newInterceptor() {
@Override
publicResponse intercept(Chain chain)throwsIOException {
Request request = chain.request();
longt1 = System.nanoTime();
Logger.t(TAG).i(String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
longt2 = System.nanoTime();
Logger.t(TAG).i(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) /1e6d, response.headers()));
returnresponse;
}
};
private static finalInterceptorREWRITE_CACHE_CONTROL_INTERCEPTOR=newInterceptor() {
@Override
publicResponse intercept(Chain chain)throwsIOException {
Request request = chain.request();
if(!NetUtil.isConnected(App.getInstance())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
Logger.t(TAG).w("no network");
}
Response originalResponse = chain.proceed(request);
if(NetUtil.isConnected(App.getInstance())) {
//有網(wǎng)的時候讀接口上的@Headers里的配置改览,你可以在這里進(jìn)行統(tǒng)一的設(shè)置
String cacheControl = request.cacheControl().toString();
returnoriginalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
.build();
}else{
returnoriginalResponse.newBuilder()
.header("Cache-Control","public, only-if-cached, max-stale=2419200")
.removeHeader("Pragma")
.build();
}
}
};
接口實(shí)現(xiàn)
public interface Request {
// ? ?頭像上傳
@Multipart
@POST("app/head_portrait_img")
Observable uploadImage(@Part List partlist);
}
調(diào)用接口
MultipartBody.Builder builder =newMultipartBody.Builder()
.setType(MultipartBody.FORM)//表單類型
.addFormDataPart("user_id", uid)
.addFormDataPart("timespan", name)
.addFormDataPart("token", useNmae);//ParamKey.TOKEN 自定義參數(shù)key常量類,即參數(shù)名
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
builder.addFormDataPart("pic_upload", file.getName(), imageBody);//imgfile 后臺接收圖片流的參數(shù)名
builder.addFormDataPart("head_ico", file.getName(), imageBody);//imgfile 后臺接收圖片流的參數(shù)名
List parts = builder.build().parts();
weiYunRequest.uploadImage(parts).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(newSubscriber() {
@Override
public voidonCompleted() {
}
@Override
public voidonError(Throwable e) {
ByAlert.alert("上傳失敗");
Log.d("Throwableisr", e.toString() +"");
unsubscribe();
Glide.with(PersonalActivity.this)
.load("")
.error(R.drawable.err_logo)
.bitmapTransform(newCropCircleTransformation(PersonalActivity.this))
.into(pereHead);
try{
closeProgressDialog();
}catch(Exception t) {
}
}
@Override
public voidonNext(finalErrorMessge bean) {
}
```