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);
}