RxJava+Retrofit+OkHttp + MVP

一简识、MvpFile(mvp)
  • BaseView
public interface BaseView {
    Context getContext();
}
  • BasePresenter
public interface BasePresenter<V extends BaseView> {
    void attachView(V view);
    void detachView();
}
  • BasePresenterImpl
public class BasePresenterImpl<V extends BaseView> implements BasePresenter<V> {

    protected V mView;

    @Override
    public void attachView(V view) {
        mView = view;
    }

    @Override
    public void detachView() {
        mView = null;
    }
}
  • MVPBaseActivity
public abstract class MVPBaseActivity<V extends BaseView, T extends BasePresenterImpl<V>> extends AppCompatActivity implements BaseView {

    public T mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = getInstance(this, 1);
        mPresenter.attachView((V) this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null)
            mPresenter.detachView();
    }

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

    public <T> T getInstance(Object o, int i) {
        try {
            return ((Class<T>) ((ParameterizedType) (o.getClass()
                    .getGenericSuperclass())).getActualTypeArguments()[i])
                    .newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassCastException e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • MVPBaseFragment
public abstract class MVPBaseFragment<V extends BaseView, T extends BasePresenterImpl<V>> extends Fragment implements BaseView {

    public T mPresenter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = getInstance(this, 1);
        mPresenter.attachView((V) this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPresenter != null)
            mPresenter.detachView();
    }

    @Override
    public Context getContext() {
        return super.getContext();
    }

    public <T> T getInstance(Object o, int i) {
        try {
            return ((Class<T>) ((ParameterizedType) (o.getClass()
                    .getGenericSuperclass())).getActualTypeArguments()[i])
                    .newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassCastException e) {
            e.printStackTrace();
        } catch (java.lang.InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }
}
二、MvpFile(loginactivity)
  • LoginContract
public class LoginContract {

    interface View extends BaseView {
    }

    interface Presenter extends BasePresenter<View> {
    }
}
  • LoginPresenter
public class LoginPresenter extends BasePresenterImpl<LoginContract.View> implements LoginContract.Presenter {
}
  • LoginActivity
public class LoginActivity extends MVPBaseActivity<LoginContract.View, LoginPresenter> implements LoginContract.View {
}
三根时、Rx-Retrofit
  • 根目錄下build.gradle添加倉(cāng)地址:
allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}
  • app目錄下build.gradle添加依賴庫(kù):
dependencies {
    compile 'com.github.wzgiceman:Rx-Retrofit:v1.0'
}
  • 添加Application并在AndroidManifest中注冊(cè)
public class MyApplication extends Application {

    // TODO 若BaseUrl全局唯一的需在此處設(shè)置,不唯一則設(shè)""称近,并在具體Api中設(shè)置BaseUrl
    public static final String APP_BASE_URL = "";

    @Override
    public void onCreate() {
        super.onCreate();
        RxRetrofitApp.init(this, APP_BASE_URL);
    }

}
  • 添加BaseActivity并繼承RxAppCompatActivity
public class BaseActivity extends RxAppCompatActivity {

    protected ProgressDialog dialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (dialog == null) {
            dialog = new ProgressDialog(this);
            dialog.setCancelable(false);
        }
    }

    protected void showLoading() {
        if (dialog != null && !dialog.isShowing()) {
            dialog.show();
        }
    }

    protected void hideLoading() {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
    }

}
  • 修改MVPBaseActivity繼承BaseActivity
四纯赎、Package(rxretrofit)
  • LoginService
public interface LoginService {

//    @GET("login/mlogin")
//    Observable<String> getLoginResult(@Query("username") String username,
//                                      @Query("password") String password);

    @FormUrlEncoded
    @POST("login/mlogin")
    Observable<String> getLoginResult(@Field("username") String username,
                                      @Field("password") String password);
}
  • LoginApi
public class LoginApi extends BaseApi {

    public static final String LOGIN_BASE_URL = "";

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public LoginApi() {
        setShowProgress(false);
        setCancel(false);
        setMothed("login/mlogin");
        setCache(false);
        // TODO 若BaseUrl非全局唯一的需在此處設(shè)置,全局唯一則在Application中設(shè)置BaseUrl
        setBaseUrl(LOGIN_BASE_URL);
    }

    @Override
    public Observable getObservable(Retrofit retrofit) {
        LoginService loginService = retrofit.create(LoginService.class);
        return loginService.getLoginResult(getUsername(), getPassword());
    }

}
五励稳、修改
  • 修改LoginContract
public class LoginContract {

    // TODO ========================================================================================
    interface View extends BaseView {
        void onNext(String result, String method);// 成功回調(diào)
        void onError(ApiException e);// 失敗回調(diào)
        void showLoad();// 顯示加載框
        void hideLoad();// 隱藏加載框
    }

    interface Presenter extends BasePresenter<View> {
        void startRequest(RxAppCompatActivity activity, BaseApi api);
    }
    // TODO ========================================================================================

}
  • 修改LoginPresenter實(shí)現(xiàn)HttpOnNextListener
public class LoginPresenter extends BasePresenterImpl<LoginContract.View> implements LoginContract.Presenter, HttpOnNextListener {

    // TODO ========================================================================================
    @Override
    public void startRequest(RxAppCompatActivity activity, BaseApi api) {
        mView.showLoad();
        HttpManager manager = new HttpManager(this, activity);
        manager.doHttpDeal(api);
    }

    @Override
    public void onNext(String result, String method) {
        mView.onNext(result, method);
        mView.hideLoad();
    }

    @Override
    public void onError(ApiException e) {
        mView.onError(e);
        mView.hideLoad();
    }
    // TODO ========================================================================================

}
  • 修改LoginActivity
public class LoginActivity extends MVPBaseActivity<LoginContract.View, LoginPresenter> implements LoginContract.View, View.OnClickListener {

    // TODO ========================================================================================
    private EditText etUsername;
    private EditText etPassword;
    private TextView tvLog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }

    private void initView() {
        etUsername = (EditText) findViewById(R.id.activity_login_et_username);
        etPassword = (EditText) findViewById(R.id.activity_login_et_password);
        tvLog = (TextView) findViewById(R.id.activity_login_tv_log);
        findViewById(R.id.activity_login_btn_login).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        startRequest();
    }

    private void startRequest() {
        LoginApi api = new LoginApi();
        api.setUsername(etUsername.getText().toString().trim());
        api.setPassword(etPassword.getText().toString().trim());
        mPresenter.startRequest(this, api);
    }

    @Override
    public void onNext(String result, String method) {
        String succeed = "成功>>>>>>>>>>>>>>>>>>>>"
                + "\n---------- result\n" + result
                + "\n---------- method\n" + method
                + "\n<<<<<<<<<<<<<<<<<<<<";
        tvLog.setText(succeed);
        Log.e("lstar", succeed);
    }

    @Override
    public void onError(ApiException e) {
        String failed = "失敗>>>>>>>>>>>>>>>>>>>>"
                + "\n---------- code\n" + e.getCode()
                + "\n---------- message\n" + e.getMessage()
                + "\n<<<<<<<<<<<<<<<<<<<<";
        tvLog.setText(failed);
        Log.e("lstar", failed);
    }

    @Override
    public void showLoad() {
        showLoading();
    }

    @Override
    public void hideLoad() {
        hideLoading();
    }
    // TODO ========================================================================================

}

如何設(shè)計(jì)一個(gè)靠譜的MVP架構(gòu)
Android MVP Plugin佃乘,一鍵完成MVP結(jié)構(gòu)代碼編寫
Android RxJava之網(wǎng)絡(luò)處理
Rx-Retrofit極簡(jiǎn)方式使用
RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)
RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驹尼,隨后出現(xiàn)的幾起案子趣避,更是在濱河造成了極大的恐慌,老刑警劉巖新翎,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件程帕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡地啰,警方通過查閱死者的電腦和手機(jī)愁拭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來髓绽,“玉大人,你說我怎么就攤上這事顺呕。” “怎么了株茶?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)启盛。 經(jīng)常有香客問我蹦掐,道長(zhǎng)僵闯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任鳖粟,我火速辦了婚禮,結(jié)果婚禮上向图,老公的妹妹穿的比我還像新娘标沪。我一直安慰自己,他們只是感情好嗜傅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布金句。 她就那樣靜靜地躺著,像睡著了一般吕嘀。 火紅的嫁衣襯著肌膚如雪违寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天币他,我揣著相機(jī)與錄音坞靶,去河邊找鬼。 笑死蝴悉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘾敢。 我是一名探鬼主播拍冠,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼簇抵!你這毒婦竟也來了庆杜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤碟摆,失蹤者是張志新(化名)和其女友劉穎晃财,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典蜕,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡断盛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愉舔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钢猛。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轩缤,靈堂內(nèi)的尸體忽然破棺而出命迈,到底是詐尸還是另有隱情,我是刑警寧澤火的,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布壶愤,位于F島的核電站,受9級(jí)特大地震影響馏鹤,放射性物質(zhì)發(fā)生泄漏征椒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一假瞬、第九天 我趴在偏房一處隱蔽的房頂上張望陕靠。 院中可真熱鬧迂尝,春花似錦、人聲如沸剪芥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)税肪。三九已至溉躲,卻和暖如春益兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疑枯。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工蛔六, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人具钥。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓骂删,卻偏偏與公主長(zhǎng)得像四啰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拟逮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容