在項目的開發(fā)當中椭住,網(wǎng)絡請求可謂是至關重要的一個環(huán)節(jié),我們需要對于的請求方法[post,get,delete...]進行統(tǒng)一的封裝店印,方便我們在項目中進行調(diào)用念搬,而不至于在每一個需要進行網(wǎng)絡請求的地方都進行一次重復的網(wǎng)絡請求方法,這里我們就想到了一個很nice的框架---retrofit涌矢,Retrofit是一個用于安卓和java的http框架掖举,通常我們會使用其進行網(wǎng)絡的連接調(diào)用
首先需要添加gradle的引用
retrofitDeps = [
retrofit2 : "com.squareup.retrofit2:retrofit:2.9.0",
//日志的攔截器
logging : "com.squareup.okhttp3:logging-interceptor:3.14.9",
google_gson: "com.google.code.gson:gson:2.8.5"
]
接下來式封裝一個全局的retrofit對象,方便我們對于后續(xù)的接口請求進行調(diào)用
public final class RetrofitHelper {
/**
* 全局的Retrofit對象,like Charset#bugLevel,HttpLoggingInterceptor#level,
* AsyncTask#mStatus,facebook->stetho->LogRedirector#sLogger,Timber->forestAsArray
* CopyOnWriteArrayList==
*/
public static volatile Retrofit DEFAULT;
private RetrofitHelper() {
throw new AssertionError("No instances.");
}
public static <T> T create(Class<T> service) {
//確保多線程的情況下retrofit不為空或者被修改了
Retrofit retrofit = DEFAULT;
if (retrofit == null) {
throw new IllegalStateException("DEFAULT == null");
}
return retrofit.create(service);
}
}
最主要的是我們需要對返回的方法進行統(tǒng)一的調(diào)用了
public abstract class AnimCallback<T> extends BodyCallback<T> {
private Dialog loadingPop;
private final Context context;
private String message;
public AnimCallback(Context context) {
this.context = context;
}
public AnimCallback(Context context, String message) {
this.context = context;
this.message = message;
}
@Override
public void onStart(Call<T> call) {
showLoading();
}
@NonNull
@Override
protected HttpError parseThrowable(Call<T> call, Throwable t) {
if (t instanceof JsonSyntaxException) {
return new HttpError("解析異常", -100, t);
}
return super.parseThrowable(call, t);
}
@Override
public void onCompleted(Call<T> call) {
hideLoading();
}
private void showLoading() {
if (loadingPop == null) {
loadingPop = new Dialog(context, R.style.NoTitleDialogStyle);
loadingPop.setContentView(R.layout.popup_loading);
loadingPop.setCanceledOnTouchOutside(false);
loadingPop.setCancelable(false);
}
loadingPop.show();
}
private void hideLoading() {
if (loadingPop != null) {
loadingPop.dismiss();
}
}
}
重中之重是我們需要對于retrofit的請求進行初始化
LogInterceptor logInterceptor = new LogInterceptor(message -> {
});
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(logInterceptor)
.connectTimeout(13L, TimeUnit.SECONDS)
.readTimeout(13L, TimeUnit.SECONDS)
.build();
RetrofitHelper.DEFAULT = new Retrofit.Builder()
.baseUrl(Constants.Urls.BASE_URL)
.callFactory(new ReplaceUrlCallFactory(client) {
@Nullable
@Override
protected HttpUrl getNewUrl(String baseUrlName, Request request) {
//這里進行動態(tài)替換baseUrl
if (baseUrlName.equals("pic")) {
String oldUrl = request.url().toString();
String newUrl = oldUrl.replace(Constants.Urls.BASE_URL,
"http://www.baidu.com/");
return HttpUrl.get(newUrl);
}
return null;
}
})
.addCallAdapterFactory(CompletableCallAdapterFactory.INSTANCE)
.addConverterFactory(GsonConverterFactory.create())
.build();
最后不要忘記了添加權限哦娜庇,否則會無法連接到網(wǎng)絡的
<uses-permission android:name="android.permission.INTERNET" />