波尔多五大产区:Sugar-快速開發安卓項目,流行框架封裝mvp + rxjava2 + retrofit2 ...

[復制鏈接]
來自: a12a15a05 分類: Android精品源碼 上傳時間: 2019-5-28 13:28:33
Tag:

項目介紹:

項目介紹:
需求:新項目只需5分鐘接入,之后直接開擼,不用關心網絡、圖片、模式、穩定等問題,支持mvp一個activity對應多個presenter。
適用自己的才是最好的!
實用到的庫(排名不分先后)
[...以及忘了加上的]()
使用效果

圖片有壓縮,可以下載demo apk進行體驗
demo-debug.apk
安裝和依賴
3種選擇
1、 git clone https://github.com/wobiancao/sugar.git? ? implementation project(':sugarlibrary')2、 implementation 'com.wobiancao:sugarlibrary:{version}'3、 allprojects {? ?? ???repositories {? ?? ?? ?? ?...? ?? ?? ?? ?maven { url 'https://jitpack.io' }? ?? ???}? ? }implementation 'com.github.wobiancao:sugar:{version}'統一配置創建DemoConfigure 繼承于SugarConfigure 重載相關方法即可:public class DemoConfigure extends SugarConfigure {? ? public DemoConfigure(Application application) {? ?? ???super(application);? ? }? ? @Override? ? public ResponseErrorListener getErrorResponse() {? ?? ???return new ResponseErrorListener() {? ?? ?? ?? ?@Override? ?? ?? ?? ?public void handleResponseError(Context context, Throwable t) {? ?? ?? ?? ?? ? LogUtils.i("捕獲異常---" + t.getMessage());? ?? ?? ?? ?? ? ToastUtils.show("發生異常---" + t.getMessage());? ?? ?? ?? ?}? ?? ???};? ? }? ? @Override? ? public int getStatusColor() {? ?? ???return R.color.colorPrimary;? ? }? ? @Override? ? public AppHttpSetting getHttpSetting() {? ?? ???return AppHttpSetting? ?? ?? ?? ?? ? .builder()? ?? ?? ?? ?? ? .with(mApplication)? ?? ?? ?? ?? ? //設置初始的baseUrl host? ?? ?? ?? ?? ? .setBaseUrl(Gank.HOST)? ?? ?? ?? ?? ? //動態修改baseUrl 具體看https://github.com/JessYanCoding/RetrofitUrlManager? ?? ?? ?? ?? ? .putDomain(Wan.DOMAN, Wan.HOST)? ?? ?? ?? ?? ? //是否打印網絡請求日志 默認否? ?? ?? ?? ?? ? .setHttpLog(true)? ?? ?? ?? ?? ? //百度Stetho即可 網絡監測等 默認否? ?? ?? ?? ?? ? .setHttpMoniter(true)? ?? ?? ?? ?? ? //設置緩存時間 默認60s? ?? ?? ?? ?? ? .setCacheMaxTime(65)? ?? ?? ?? ?? ? //設置連接超時 默認20s? ?? ?? ?? ?? ? .connectTimeout(20)? ?? ?? ?? ?? ? //設置讀取超時 默認20s? ?? ?? ?? ?? ? .readTimeout(20)? ?? ?? ?? ?? ? //設置寫入超時 默認20s? ?? ?? ?? ?? ? .writeTimeout(20)? ?? ?? ?? ?? ? //請求header? ?? ?? ?? ?? ? .addHeaderInterceptor(getHeader())? ?? ?? ?? ?? ? //添加請求明文公共參數? ?? ?? ?? ?? ? .addCustomHeaderInterceptor(getCustomHeader())? ?? ?? ?? ?? ? //token過期等請求成功處理 一般不需要處理//? ?? ?? ?? ?? ? .addExceptionInterceptor(getExceptionInterceptor())? ?? ?? ?? ?? ? //其它攔截//? ?? ?? ?? ?? ? .addInterceptor(xx)//? ?? ?? ?? ?? ? .addNetworkInterceptor(xxx)//? ?? ?? ?? ?? ? 配置自己的緩存//? ?? ?? ?? ?? ? .cache(xx)? ?? ?? ?? ?? ? //甚至另外寫一套自己的okhttp builder 也行//? ?? ?? ?? ?? ? .setOkHttpBuilder(xxx)? ?? ?? ?? ?? ? .build();? ? }? ? @Override? ? public IToastStyle getToastStyle() {? ?? ???return new ToastStyle();? ? }}
  • 創建DemoApplication繼承于 LibApplication < S extends SugarConfigure > 重寫initConfigure()初始化配置即可,詳見DemoApplication

public class DemoApplication extends LibApplication {? ? @Override? ? protected void initConfigure() {? ?? ???mConfigure = new DemoConfigure(this);? ? }? ? @Override? ? protected void init() {? ? }}網絡請求統一配置
  • 問題: 我們使用RetrofitUrlManager 解決了retorfit動態配置baseUrl的問題,但是每個域名或者說每個接口返回參數封裝等的可能不統一(這種情況一般不會出現在公司項目)比如我這個app要展示Gank.ioWanAndroid的界面,這樣就是兩個網絡請求封裝,使用sugar可以快速解決此類問題;
  • 使用之前先看源碼SugarRepository

/** * @author wobiancao * @date 2019/5/20 * desc : */public class SugarRepository {? ? /**? ???* 0 沒loading 1 dialog形式??2page形式? ???*/? ? protected final static int LOADING_TYPE_NULL = 0;? ? /**? ???* 0 沒loading 1 dialog形式??2page形式? ???*/? ? protected final static int LOADING_TYPE_DIALOG = 1;? ? /**? ???* 0 沒loading 1 dialog形式??2page形式? ???*/? ? protected final static int LOADING_TYPE_PAGE = 2;? ? protected BaseIView mIView;? ? public SugarRepository(BaseIView IView) {? ?? ???mIView = IView;? ? }? ? protected Observable addObservable(Observable observable) {? ?? ???if (mIView == null) {? ?? ?? ?? ?return null;? ?? ???}? ?? ???return customObservable(observable);? ? }? ? protected Observable addObservable(Observable observable, int loadingType) {? ?? ???if (mIView == null) {? ?? ?? ?? ?return null;? ?? ???}? ?? ???return customObservable(observable)? ?? ?? ?? ?? ? .doOnSubscribe(disposable -> {? ?? ?? ?? ?? ?? ???if (loadingType > 0) {? ?? ?? ?? ?? ?? ?? ?? ?if (loadingType == LOADING_TYPE_DIALOG) {? ?? ?? ?? ?? ?? ?? ?? ?? ? mIView.showDialogLoading();? ?? ?? ?? ?? ?? ?? ?? ?} else {? ?? ?? ?? ?? ?? ?? ?? ?? ? mIView.showLoading();? ?? ?? ?? ?? ?? ?? ?? ?}? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? });? ? }? ? private Observable customObservable(Observable observable) {? ?? ???return observable? ?? ?? ?? ?? ? .compose(mIView.getProvider().bindToLifecycle())? ?? ?? ?? ?? ? .retryWhen(new RetryWithDelay(2, 2))? ?? ?? ?? ?? ? .subscribeOn(Schedulers.io())? ?? ?? ?? ?? ? .subscribeOn(AndroidSchedulers.mainThread())? ?? ?? ?? ?? ? .observeOn(AndroidSchedulers.mainThread())? ?? ?? ?? ?? ? .doFinally(() -> {? ?? ?? ?? ?? ?? ???if (mIView != null) {? ?? ?? ?? ?? ?? ?? ?? ?mIView.hideDialogLoading();? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? })? ?? ?? ?? ?? ? .doOnNext(o -> {? ?? ?? ?? ?? ?? ???LogUtils.e("doOnNext------" + o);? ?? ?? ?? ?? ?? ???if (mIView != null) {? ?? ?? ?? ?? ?? ?? ?? ?mIView.showLoadSuccess();? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? })? ?? ?? ?? ?? ? .doOnError(throwable -> {? ?? ?? ?? ?? ?? ???LogUtils.e("doOnError------" + throwable);? ?? ?? ?? ?? ?? ???if (mIView != null) {? ?? ?? ?? ?? ?? ?? ?? ?mIView.showLoadFailed();? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? });? ? }}
  • addObservable(Observable observable)不會使用任何loading效果,
    addObservable(Observable observable, int loadingType) loadingType : 0 沒loading 、1 dialog形式 、2 page形式
  • Repository首先有個契約類,RepositoryContract
    xxxModel為需要增加的一個域名接口,統一配置apiService、請求函數、相應的transformer

/*** @author wobiancao* @date 2019-05-21* desc :
  • class RepositoryContract {
    /**
    * gank.io*/
    public interface GankModel {
    ? ?Gank getService();? ?/**? ? * Transformer 需要處理api返回值包裝的加上即可? ? * @param ? ? * @return? ? */? ? ObservableTransformer, T> gankTransformer();? ?Observable<List> getFuliDataRepository(String size, String index);
    }
    /**
    * wanandroid*/
    public interface WanModel{
    ? ?Wan getService();? ?/**? ? * Transformer 需要處理api返回值包裝的加上即可? ? * @param ? ? * @return? ? */? ? ObservableTransformer, T> wanTransformer();? ?Observable getWanArticleList(String index);
    }
    }

/*** @author wobiancao* @date 2019/5/20* desc :*/public class GankRepository extends SugarRepository implements RepositoryContract.GankModel {? ?public GankRepository(BaseIView IView) {? ?? ? super(IView);? ?}? ?@Override? ?public Gank getService() {? ?? ? return AppHttpClient.getInstance().initService(Gank.class);? ?}? ?@Override? ?public ObservableTransformer, T> gankTransformer() {? ?? ? return upstream -> upstream? ?? ?? ?? ?? ?.flatMap((Function, ObservableSource>) tGirlsResult -> {? ?? ?? ?? ?? ?? ? if (tGirlsResult == null) {? ?? ?? ?? ?? ?? ?? ???return Observable.error(new HttpException("返回值為null"));? ?? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ? if (!tGirlsResult.error) {? ?? ?? ?? ?? ?? ?? ???return Observable.just(tGirlsResult.results);? ?? ?? ?? ?? ?? ? } else {? ?? ?? ?? ?? ?? ?? ???return Observable.error(new HttpException("接口異常"));? ?? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?});? ?}? ?@Override? ?public Observable> getFuliDataRepository(String size, String index) {? ?? ? return addObservable(getService()? ?? ?? ?? ?? ?.getFuliData(size, index)? ?? ?? ?? ?? ?.compose(gankTransformer()), LOADING_TYPE_PAGE);? ?}}
### 最后mvp創建(之后會寫相應的Template)
  • =。=假的,接下來看代碼

WanContract
/** * @author wobiancao * @date 2019-05-21 * desc : */public class WanContract {? ? public interface PView{? ?? ???void getWanArticleList(String index);? ? }? ? public interface IView extends BaseIView {? ?? ???/**? ?? ?? ?* 綁定列表數據? ?? ?? ?* @param data? ?? ?? ?*/? ?? ???void bindData(WanData data);? ? }}
WanPresenter
/** * @author wobiancao * @date 2019-05-21 * desc : */public class WanPresenter extends BasePresenter implements WanContract.PView {? ? @Override? ? protected void initRepository() {? ?? ???mModel = new WanRepository(mView);? ? }? ? @Override? ? public void getWanArticleList(String index) {? ?? ???mModel.getWanArticleList(index)? ?? ?? ?? ?? ? .subscribe(new ErrorHandleSubscriber(rxErrorHandler) {? ?? ?? ?? ?? ?? ???@Override? ?? ?? ?? ?? ?? ???public void onNext(WanData wanData) {? ?? ?? ?? ?? ?? ?? ?? ?mView.bindData(wanData);? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? });? ? }}
  • 就是這么簡單,最后就是在view層如何使用了,老規矩先看代碼WanActivity

/** * @author wobiancao * @date 2019-05-21 * desc : */@CreatePresenter(presenter = WanPresenter.class)public class WanActivity extends BaseActivity implements WanContract.IView {? ? @PresenterVariable? ? WanPresenter mPresenter;? ? TextView mInfoView;? ? Toolbar mToolbar;? ? @Override? ? protected int getContentView() {? ?? ???return R.layout.gank_activity_list;? ? }? ? @Override? ? public void init(Bundle savedInstanceState) {? ?? ???mInfoView = findViewById(R.id.tv_info);? ?? ???mToolbar = findViewById(R.id.toolbar);? ?? ???setSupportActionBar(mToolbar);? ?? ???ActionBar actionBar = getSupportActionBar();? ?? ???if (actionBar != null) {? ?? ?? ?? ?actionBar.setDisplayHomeAsUpEnabled(true);? ?? ?? ?? ?actionBar.setTitle("WanAndroid");? ?? ???}? ? }? ? @Override? ? public void loadData() {? ?? ???mPresenter.getWanArticleList("1");? ? }? ? @Override? ? public void bindData(WanData data) {? ?? ???String jsonStr = new Gson().toJson(data);? ?? ???mInfoView.setText(jsonStr);? ? }? ? @Override? ? public boolean onOptionsItemSelected(MenuItem item) {? ?? ???int id = item.getItemId();? ?? ???switch (id) {? ?? ?? ?? ?case android.R.id.home:? ?? ?? ?? ?? ? finish();? ?? ?? ?? ?? ? break;? ?? ???}? ?? ???return super.onOptionsItemSelected(item);? ? }}是的Presenter創建只需要注解即可,并且支持多個presenter這里要萬分感謝EasyMvp一個簡單強大且靈活的MVP框架
  • 首先,單個presenter

@CreatePresenter(presenter = WanPresenter.class)public class WanActivity extends BaseActivity implements WanContract.IView
獲取presenter變量兩種方式
1、通過注解
@PresenterVariableWanPresenter mPresenter;
2、通過getPresenter()函數
xxActivity extends BaseActivity...xxPresenter getPresenter()
  • 多個prenenter
    就只有通過注解獲得變量了

@CreatePresenter(presenter = {xxPresenter1.class, xxPresenter2.class})xxActivity extends BaseActivity...@PresenterVariablexxPresenter1 mPresenter1;@PresenterVariablexxPresenter2 mPresenter2;本庫github地址 sugar 簡單便捷 快速開發Android項目,集合流行框架封裝mvp + rxjava2 + retrofit2 + rxlifecycle2 + arouter...LicenseCopyright 2019, wobiancao? ?Licensed under the Apache License, Version 2.0 (the "License");? ?you may not use this file except in compliance with the License.? ?You may obtain a copy of the License at? ?? ? //www.apache.org/licenses/LICENSE-2.0? ?Unless required by applicable law or agreed to in writing, software? ?distributed under the License is distributed on an "AS IS" BASIS,? ?WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.? ?See the License for the specific language governing permissions and? ?limitations under the License.


相關源碼推薦:

回復

恋恋波尔多 www.luaogj.com.cn 舉報

我來說兩句
所有評論(166)
九霄逆鱗 2019-5-29 10:50:50
樓主威武啊,安卓巴士有你更給力!
回復
allow.xuweibin 2019-5-29 10:57:45
感覺樓主很用心,辛苦啦~
回復
應用安卓 2019-5-29 11:10:36
樓主是好人,回個帖會有安幣嗎?
回復
rebecca 2019-5-29 11:15:30
感謝大神~
回復
知新1990 2019-5-29 11:17:11
樓主是好人,回個帖會有安幣嗎?
回復
fancy 2019-5-29 11:20:05
支持樓主,支持安卓巴士!
回復
是個寶寶 2019-5-29 11:23:36
感謝分享,樓主V5~
回復
提取碼:  下載次數:66 狀態:已購或VIP 售價:15(原價:15)金錢 下載權限:初級碼農 
912 2 66
代碼貢獻英雄榜
用戶名 下載數
聯系我們
首頁/微信公眾賬號投稿

帖子代碼編輯/版權問題

QQ:435399051,769657487

如何獲得代碼達人稱號

如何成為簽約作者

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反?。[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )