1.IBase
package com.example.a1512qmvp.inter; public interface IBase { int getContentLayout(); void inject(); }
2.BaseContract
package com.example.a1512qmvp.ui.base; public interface BaseContract { //抽取所有Presenter共性,比如绑定,解绑 interface BasePresenter<T extends BaseView> { void attchView(T view); void detachView(); } //抽取所有View的共性,比如显示进度条和关闭进度 interface BaseView { void showLoading(); void dismissLoading(); } }
3.BasePresenter
package com.example.a1512qmvp.ui.base; /** * 所有Presenter的积累,实现了BaseContract.BasePresenter接口 * * @param <T> */ public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> { protected T mView; @Override public void attchView(T view) { this.mView = view; } @Override public void detachView() { if (mView != null) { mView = null; } } }
4.BaseActivity
package com.example.a1512qmvp.ui.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import com.example.a1512qmvp.inter.IBase; import javax.inject.Inject; public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends AppCompatActivity implements IBase, BaseContract.BaseView { @Inject protected T mPresenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentLayout()); inject(); //绑定 mPresenter.attchView(this); } @Override protected void onDestroy() { super.onDestroy(); //解绑 mPresenter.detachView(); } @Override public void showLoading() { } @Override public void dismissLoading() { } }
5.LoginContract
package com.example.a1512qmvp.ui.login.contract; import com.example.a1512qmvp.bean.UserBean; import com.example.a1512qmvp.ui.base.BaseContract; public interface LoginContract { interface View extends BaseContract.BaseView { void loginSuccess(UserBean userBean); } interface Presenter extends BaseContract.BasePresenter<View> { void login(String mobile, String password); } }
6.LoginPresenter
package com.example.a1512qmvp.ui.login.presenter; import com.example.a1512qmvp.bean.UserBean; import com.example.a1512qmvp.net.LoginApi; import com.example.a1512qmvp.ui.base.BasePresenter; import com.example.a1512qmvp.ui.login.contract.LoginContract; import javax.inject.Inject; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter { private LoginApi loginApi; @Inject public LoginPresenter(LoginApi loginApi) { this.loginApi = loginApi; } @Override public void login(String mobile, String password) { loginApi.login(mobile, password) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<UserBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(UserBean userBean) { mView.loginSuccess(userBean); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }
7.LoginActivity
package com.example.a1512qmvp.ui.login; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.a1512qmvp.R; import com.example.a1512qmvp.bean.UserBean; import com.example.a1512qmvp.component.DaggerHttpComponent; import com.example.a1512qmvp.module.HttpModule; import com.example.a1512qmvp.ui.base.BaseActivity; import com.example.a1512qmvp.ui.login.contract.LoginContract; import com.example.a1512qmvp.ui.login.presenter.LoginPresenter; public class LoginActivity extends BaseActivity<LoginPresenter> implements View.OnClickListener, LoginContract.View { private EditText mMobile; private EditText mPassword; private Button mBtLogin; @Override public int getContentLayout() { return R.layout.activity_login; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } private void initView() { mMobile = (EditText) findViewById(R.id.mobile); mPassword = (EditText) findViewById(R.id.password); mBtLogin = (Button) findViewById(R.id.btLogin); mBtLogin.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.btLogin: //需要调用P层,去完成接口调用 String mobile = mMobile.getText().toString(); String password = mPassword.getText().toString(); mPresenter.login(mobile, password); break; } } @Override public void loginSuccess(UserBean userBean) { Toast.makeText(LoginActivity.this, userBean.getMsg(), Toast.LENGTH_SHORT).show(); } }
8.Api
package com.example.a1512qmvp.net; public interface Api { String BASEURL = "https://www.zhaoapi.cn/"; }
9.LoginApiService
package com.example.a1512qmvp.net; import com.example.a1512qmvp.bean.UserBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface LoginApiService { @FormUrlEncoded @POST("user/login") Observable<UserBean> login(@Field("mobile") String mobile, @Field("password") String password); }
10.LoginApi
package com.example.a1512qmvp.net; import com.example.a1512qmvp.bean.UserBean; import io.reactivex.Observable; public class LoginApi { private static LoginApi loginApi; private LoginApiService loginApiService; private LoginApi(LoginApiService loginApiService) { this.loginApiService = loginApiService; } public static LoginApi getLoginApi(LoginApiService loginApiService) { if (loginApi == null) { loginApi = new LoginApi(loginApiService); } return loginApi; } public Observable<UserBean> login(String mobile, String password) { return loginApiService.login(mobile, password); } }
11.HttpModule
package com.example.a1512qmvp.module; import com.example.a1512qmvp.net.Api; import com.example.a1512qmvp.net.LoginApi; import com.example.a1512qmvp.net.LoginApiService; import java.util.concurrent.TimeUnit; import dagger.Module; import dagger.Provides; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @Module public class HttpModule { @Provides LoginApi provideLoginApi() { OkHttpClient okHttpClient = new OkHttpClient.Builder() .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASEURL) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); LoginApiService loginApiService = retrofit.create(LoginApiService.class); return LoginApi.getLoginApi(loginApiService); } }
12.HttpComponent
package com.example.a1512qmvp.component; import com.example.a1512qmvp.module.HttpModule; import com.example.a1512qmvp.ui.login.LoginActivity; import dagger.Component; @Component(modules = HttpModule.class) public interface HttpComponent { void inject(LoginActivity loginActivity); }