retrofit進行網(wǎng)絡請求框架封裝

在項目的開發(fā)當中,網(wǎng)絡請求可謂是至關(guān)重要的一個環(huán)節(jié),我們需要對于的請求方法[post,get,delete...]進行統(tǒng)一的封裝,方便我們在項目中進行調(diào)用,而不至于在每一個需要進行網(wǎng)絡請求的地方都進行一次重復的網(wǎng)絡請求方法,這里我們就想到了一個很nice的框架---retrofit,Retrofit是一個用于安卓和java的http框架,通常我們會使用其進行網(wǎng)絡的連接調(diào)用

retrofit官網(wǎng)

首先需要添加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();

最后不要忘記了添加權(quán)限哦,否則會無法連接到網(wǎng)絡的

<uses-permission android:name="android.permission.INTERNET" />

代碼傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容