當下最流行的網絡請求組合,retrofit2+okhttp+rxjava+mvp

這里是封裝記錄篇
首先分模塊,比如登錄

先來說封裝后的使用
package com.fragmentapp.login.presenter; import android.util.Log; import com.fragmentapp.base.BasePresenter; import com.fragmentapp.http.BaseObserver; import com.fragmentapp.http.BaseResponses; import com.fragmentapp.login.bean.LoginDataBean; import com.fragmentapp.login.imple.ILoginModel; import com.fragmentapp.login.imple.ILoginView; import com.fragmentapp.login.model.LoginModel; /** * Created by liuzhen on 2017/11/3. */ public class LoginPresenter extends BasePresenter { private ILoginView view; private ILoginModel model; public LoginPresenter(ILoginView view){ this.view = view; model = new LoginModel(); } public void login(String username,String pwd){ model.login(observer,username,pwd); } BaseObserver<BaseResponses<LoginDataBean>> observer = new BaseObserver<BaseResponses<LoginDataBean>>(){ @Override public void onNextResponse(BaseResponses<LoginDataBean> loginDataBean) { Log.e("token",loginDataBean.getData().getHCACCESSTOKEN()+""); view.success(loginDataBean.getData()); } @Override public void onErrorResponse(BaseResponses<LoginDataBean> loginDataBean) { view.error(); } @Override public void onNetWorkError(String val) { view.error(); } }; }
通過p層的接口來交互,model去訪問網絡請求,然后返回結果回調返回到view層去刷新
這里自定義了一個base的obsever類,避免多次的傳遞接口

model則負責調用網絡請求了
package com.fragmentapp.login.model; import com.fragmentapp.http.BaseObserver; import com.fragmentapp.http.BaseResponses; import com.fragmentapp.http.RetrofitHelper; import com.fragmentapp.login.bean.LoginDataBean; import com.fragmentapp.login.imple.ILoginModel; import java.util.HashMap; import java.util.Map; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; /** * Created by liuzhen on 2017/11/7. */ public class LoginModel implements ILoginModel { @Override public void login(final BaseObserver<BaseResponses<LoginDataBean>> observer,String username,String pwd) { Map<String, String> map = new HashMap<>(); map.put("account[username]", username); map.put("account[password]", pwd); RetrofitHelper.getInstance().getService() .login(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } }
view層的回調也只有兩個接口,可以根據自己的需求添加
package com.fragmentapp.login.imple; import com.fragmentapp.login.bean.LoginDataBean; /** * Created by liuzhen on 2017/11/6. */ public interface ILoginView { void success(LoginDataBean dataBean); void error(); }

訪問網絡后直接在activity里處理回調的結果刷新界面等
這里的retrofit的訪問url是用的添加頭部tag來達到動態訪問替換baseurl的目的

然后接口參數采用map的方式添加,個人感覺一個個分開來跟煩,每次都得改service類

然后observable套用了一層類型,這里主要是后台數據格式吭,可以去掉
package com.fragmentapp.http; /** * Created by liuzhen on 2017/11/3. */ public class BaseResponses<T> { private String info; private int status; private T data; public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
然后是base的observer類,在里面根據自己的業務去回調自定義的接口,這樣就不用每次重載這么多的方法了
package com.fragmentapp.http; import android.os.Looper; import android.util.Log; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; /** * Created by liuzhen on 2017/11/3. */ public abstract class BaseObserver<T extends BaseResponses> implements Observer<T> { String TAG = getClass().getSimpleName(); @Override public void onSubscribe(Disposable d) { Log.e(TAG, "onSubscribe"); } @Override public void onNext(T t) { Log.e(TAG, "onNext"+t); if (t.getStatus() == 200) { onNextResponse(t); } else { Log.e(TAG, "ErrorStatus:" + t.getStatus() + "ErrorInfo" + t.getInfo()); onErrorResponse(t); } } @Override public void onError(Throwable e) { Log.e(TAG, "onError" + e.toString()); onNetWorkError("onError 網絡超時,請重新嘗試--"+e.getMessage()); if (Looper.myLooper() == null) { Looper.prepare(); Log.e(TAG,"onError 網絡超時,請重新嘗試"); Looper.loop(); } } @Override public void onComplete() { Log.e(TAG, "onComplete"); } /**返回成功*/ public abstract void onNextResponse(T t); /**接口失敗信息*/ public abstract void onErrorResponse(T t); /**網絡錯誤*/ public abstract void onNetWorkError(String val); }


這個沒啥好說的了
封裝好了添加東西也就方便許多了,前面的工作不就是為了后期的迭代方便嗎
比如添加一個dialog加載框,首先先添加兩個回調方法

然后統一在observer里調用接口方法

只需要在presenter層的回調的統一調用就行了,在view層完全不用理會,而且邏輯的控制也能很好的添加,然后在view層實現方法,在方法里去調用dialog的show方法

至於這里的dialog是自己自定義了一個簡單的progress控件,然后在base里面去操作的,這樣在view加載的時候直接調用方法就行了,這里是和空頁面一起操作的,空頁面有專門寫,在上一篇

效果如下圖

GitHub:https://github.com/1024477951/FragmentApp
