1. 程式人生 > >Android MVP,Retrofit請求庫封裝

Android MVP,Retrofit請求庫封裝

前言

我們在開始一個新專案的時候,肯定會涉及到一些通用工具的使用,比如一些util工具類、圖片載入庫、網路請求庫等。本篇博文就是對這些通用工具類的一些封裝,這樣可以節省很多開發時間。下面就以Retrofit的封裝為例向大家介紹如何使用這些library。

Api

public class Api {

    private static final int TIME_OUT = 10000;
    private static final Map<String, Object> mServiceMap = new HashMap<>();

    private
Api() { } public <S> S getService(Class<S> serviceClass) { String className = serviceClass.getName(); if (!(mServiceMap.containsKey(className))) { throw new RuntimeException("You must init " + className + " first when application init !"); } return
(S) mServiceMap.get(className); } public <S> void init(Class<S> serviceClass, String baseUrl, OkHttpClient client) { if (client == null) { client = new OkHttpClient.Builder() .connectTimeout(TIME_OUT, TimeUnit.MILLISECONDS) .writeTimeout(TIME_OUT, TimeUnit.MILLISECONDS) .readTimeout(TIME_OUT, TimeUnit.MILLISECONDS) .build(); } if
(baseUrl == null || TextUtils.isEmpty(baseUrl)) { throw new NullPointerException("baseUrl can not be null"); } if (!baseUrl.endsWith("/")) { throw new IllegalArgumentException("baseUrl must be end with /"); } createService(serviceClass, baseUrl, client); } public static Api getInstance() { return SingleHolder.API_INSTANCE; } private static class SingleHolder { private static final Api API_INSTANCE = new Api(); } private <S> void createService(Class<S> serviceClass, String baseUrl, OkHttpClient client) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); S service = retrofit.create(serviceClass); mServiceMap.put(serviceClass.getName(), service); } }

開始使用

目錄結構

這裡寫圖片描述

引用方式

1. library

  • Import Module
    這裡寫圖片描述
    這裡寫圖片描述
  • 新增依賴
    在build.gradle檔案中新增依賴
implementation project(':apilibrary')

2. aar檔案

  • 編譯apilibrary庫生成aar檔案

  • 複製aar檔案到專案libs資料夾下

  • 在build.gradle檔案中新增依賴
    根目錄下新增

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies下新增

implementation(name: 'apilibrary-release', ext: 'aar')

開始使用

  • 新增依賴
    這裡我們需要在專案的app目錄下的build.gradle檔案中引入apilibrary中使用到的庫,比如Retrofit、RxJava。
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
  • 建立ApiService
    建立ApiService用於存放我們的請求方法。
public interface ApiService {
    //模擬方法,根據實際網路請求新增
    @GET("category/query")
    Observable<DataResponse> getData(@Query("key") String key);
}
  • Application中初始化apilibrary
    這裡base url和client根據專案需求定義。
public class ProjectApplication extends Application {

    private static final String BASE_URL = "http://base.url/";
    private OkHttpClient client = new OkHttpClient.Builder()
            .build();

    @Override
    public void onCreate() {
        super.onCreate();
        Api.getInstance().init(ApiService.class, BASE_URL, client);
    }
}

使用MVP模式載入資料

apilibrary中同時封裝了BaseView和BasePresenter,所以我們可以用MVP模式實現資料請求。
  • 建立DataView繼承BaseView
public interface DataView extends BaseView<DataResponse> {
}
  • 建立DataPresenter繼承BasePresenter
public class DataPresenter implements BasePresenter<DataView> {

    private DataView mView;

    @Override
    public void attachView(DataView dataView) {
        mView = dataView;
    }

    @Override
    public void detachView() {
        mView = null;
    }
}
  • Activity實現DataView介面並初始化DataPresenter
public class MainActivity extends AppCompatActivity implements DataView {

    private DataPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = new DataPresenter();
        mPresenter.attachView(this);
    }

    @Override
    public Context getMyContext() {
        return this;
    }

    @Override
    public void onError(Throwable throwable) {
        //異常錯誤處理
    }

    @Override
    public void showProgress() {
        //顯示載入dialog
    }

    @Override
    public void dismissProgress() {
        //消失dialog
    }

    @Override
    public void setData(DataResponse dataResponse) {
        //展示資料
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //Activity銷燬時取消網路請求
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }
}
  • DataPresenter中請求資料
public class DataPresenter implements BasePresenter<DataView> {

    private DataView mView;
    private Disposable mDataDisposable;

    @Override
    public void attachView(DataView dataView) {
        mView = dataView;
    }

    @Override
    public void detachView() {
        mView = null;
        if (mDataDisposable != null) {
            mDataDisposable.dispose();
        }
    }

    public void getData() {
        if (mView == null) {
            return;
        }
        mView.showProgress();
        Api.getInstance().getService(ApiService.class)
                .getData("key")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<DataResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        mDataDisposable = d;
                    }

                    @Override
                    public void onNext(DataResponse dataResponse) {
                        if (mView != null) {
                            //資料載入回撥
                            mView.setData(dataResponse);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (mView != null) {
                            mView.onError(e);
                            mView.dismissProgress();
                        }
                    }

                    @Override
                    public void onComplete() {
                        if (mDataDisposable != null) {
                            mDataDisposable.dispose();
                        }
                        if (mView != null) {
                            mView.dismissProgress();
                        }
                    }
                });

    }
}
  • MainActivity中請求資料
mPresenter.getData();

專案混淆

如果你的專案需要混淆處理的話,需要在proguard-rules.pro檔案中新增以下配置。

-keep class com.kxg.apilibrary.**{*;}

# RxJava and RxAndroid
-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}

# OkHttp3
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature

# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod

多base url支援

  • 如果你的專案有多個base url的話,apilibrary也同樣支援,只不過你需要再建立一個ApiService2。
public interface ApiService2 {
}
  • 同樣的在Application中初始化,其請求使用步驟和上面介紹的ApiService是一樣的。
public class ProjectApplication extends Application {

    private static final String BASE_URL = "http://base.url";
    private OkHttpClient client = new OkHttpClient.Builder()
            .build();

    private static final String ANOTHER_BASE_URL = "http://another.base.url";

    @Override
    public void onCreate() {
        super.onCreate();
        Api.getInstance().init(ApiService.class, BASE_URL, client);

        Api.getInstance().init(ApiService2.class, ANOTHER_BASE_URL, client);
    }
}

總結

以上就是關於Retrofit的相關封裝,並結合MVP模式演示了請求示例,希望你可以用到你的專案中,如整合遇到問題的話可留言或郵件[email protected]

util-project原始碼下載

相關推薦

Android MVPRetrofit請求封裝

前言 我們在開始一個新專案的時候,肯定會涉及到一些通用工具的使用,比如一些util工具類、圖片載入庫、網路請求庫等。本篇博文就是對這些通用工具類的一些封裝,這樣可以節省很多開發時間。下面就以Retrofit的封裝為例向大家介紹如何使用這些library。

Android 各大網路請求的比較及實戰android請求實戰

自己學習android也有一段時間了,在實際開發中,頻繁的接觸網路請求,而網路請求的方式很多,最常見的那麼幾個也就那麼幾個。本篇文章對常見的網路請求庫進行一個總結。 HttpUrlConnection 最開始學android的時候用的網路請求是HttpUrlConne

Android兩大網路請求

Retrofit2請求庫 新增依賴: compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'com.sq

Android MVPMVC

android mvp分層架構優雅寫程式碼: mvp無非 model(資料)、view(介面)、presenter(邏輯)。model對應本地持久化或遠端服務端資料,而在筆者看來其實就是對應一個bean物件,然而這個bean物件由遠端伺服器或本地持久化而得到,因而此層需封裝

android MVP + dagger2 + Retrofit + Rxjava+okhttp android基礎專案框架搭建(2)--之MVP引入

上一篇文章中,我們已經成功的引入了Dagger2;今天我們將繼續使用android MVP模式對程式碼進行實現。#1 將MainActivity.java檔案移動到ui包下,並在ui包下建立view包; view包下存放介面。包及類結構如圖  2 新建presenter包,

Android開發使用Retrofit發送HTTP請求

service fin tps protect convert exceptio code find content 在build.gradle(Module: app)中加入 dependencies { ... implementation ‘com.

Android MVP開發模式及Retrofit + RxJava封裝

程式碼已上傳到Github,因為介面都是模擬無法進行測試,明白大概的邏輯就行了! 歡迎瀏覽我的部落格——https://pushy.site 1. MVP模式 1.1 介紹 如果熟悉MVP模式架構的話,對下圖各元件的呼叫關係應該不陌生: 和其他傳統模式相比,MVP有以下的幾個特點:

Retrofit 2.0使用詳解配合OkHttp、GsonAndroid最強網路請求框架

1.使用retrofit,需要下載一些jar包 2.介紹這些jar包的作用 在1.x版本的retrofit框架: 只需要Retrofit包和gson-2.4.jar包就行了,那時的Retrofit預設是使用okhttp jar包來網路請

Android肝帝戰紀之網路請求框架封裝(Retrofit封裝)

網路請求框架封裝(OkHttp3+Retrofit+loading的封裝) Retrofit的Github連結 點此連結到Github AVLoadingIndicatorView的Github連結(封裝到請求框架中,請求過程中的loading樣式框(

Android最火框架--Retrofit網路請求

PS:對於Android框架有很多,但一般人都不瞭解,就像網路這一塊,你是不是還在HttpURLConnection,或者HttpClient,這是原始的,而且一般人也都會,這裡我介紹一個網路請求庫,

Android中的RxJavaRetrofitMVP的使用

RxJava,Retrofit,MVP都是近幾年討論的比較熱門的話題,我們也來湊個熱鬧! 本博不展開討論,分別討論的文章有很多,後續有時間給出RxJava,Retrofit的原始碼分析 先來說一下MVP(Model View Presenter)熟悉MVC結

Retrofit網路請求工具類的封裝

對於Retrofit的使用我就不介紹了,使用也不難,隨便去搜兩篇文章看看。 我主要介紹的就是如何封裝,簡便使用。 一、Retrofit工具類的封裝(核心類) /** * Retrofit工具類 */ public class RetrofitUtils {

android中Retrofit2.0的封裝:設計到請求前後的操作比如新增請求攔截請求攔截返回體等

這裡關於android如何整合retrofit2.0就詳細介紹了,相信網路上也有很多的例子。首先retrofit關於請求體如何加入的話,這裡使用註解就能解決大部分問題,而retrofit官網也給出了很多很好用的註解,只要在interface中宣告就行。主要使用分為以下例子:①

減少與數據的連接提高請求效率

數據庫連接工時系統代碼優化記錄:在查看工時詳情的時候,我們需要將個人的工時分項目,每月進行一個展示。一年有12個月,一個人有多個項目。初始代碼只是為了實現功能,所以在代碼中進行的循環操作,即每個項目每月到數據庫中獲取該用用戶的工時統計。這樣就造成了多次請求數據庫,強求效率很低。差不多查詢一次要2500ms的時

Android URLConnection發送Get請求 HttpGet封裝

返回 turn ava cep obj pub rac stack upn 一.使用URLConnection發送Get請求 1.與服務器建立連接: URLConnection connection=new URL(“https://www.baidu.com/”).op

優雅地實現Android主流圖片加載框架封裝可無侵入切換框架

ror 要去 out drawable 如果 jpg gre cached square 項目開發中,往往會隨著需求的改變而切換到其它圖片加載框架上去。如果最初代碼設計的耦合度太高,那麽恭喜你,成功入坑了。至今無法忘卻整個項目一行行去復制粘貼被支配的恐懼。:) 那麽是否存在

Retrofit網路請求

本文主要是參考慕課網Jennynick老師視訊所做出的總結。 一、首先明白一點: Retrofit是基於Okhttp網路框架進行的二次封裝,其本質仍是Okhttp。(類似烏爾奇奧拉的二段歸刃) 另外,科普一下,Android5.0之後不再使用HttpClient了。本來還想著看看http

Charles抓web http、https請求Android http、https請求

 為什麼要抓包? 抓包:能幫助我們定位問題,是後端接口出現的問題,還是前段有問題 Windows下http請求 怎麼攔截請求? 選中要攔截的請求,滑鼠右鍵,點選breakpoints,設定斷點,即可攔截請求 下次再請求這個http路徑時,就自動跳出下面內容 怎麼修改請求 修改r

Android架構】基於MVP模式的Retrofit2+RXjava封裝之常見問題(四)

###先回顧下之前的 【Android架構】基於MVP模式的Retrofit2+RXjava封裝(一) 【Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案下載(二) 【Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案上傳(三)

Android架構】基於MVP模式的Retrofit2+RXjava封裝(一)

#最近有個新專案要做,搭建框架的時候,順便梳理了下MVP模式,特此記錄,歡迎大家指正。 專案地址GitHub 一 、首先是依賴 compile 'com.google.code.gson:gson:2.8.0' compile 'com.squareup.ok