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 MVP,Retrofit請求庫封裝
前言 我們在開始一個新專案的時候,肯定會涉及到一些通用工具的使用,比如一些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 MVP,MVC
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、Gson,Android最強網路請求框架
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中的RxJava,Retrofit,MVP的使用
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