导依赖
config.gradle
ext { android = [ compileSdkVersion: 27, applicationId : "com.example.administrator.myapplication", minSdkVersion : 15, targetSdkVersion : 27, versionCode : 1, versionName : "1.0" ] dependencies = [ "appcompat-v7" : "com.android.support:appcompat-v7:27.1.1", "constraint-layout": "com.android.support.constraint:constraint-layout:1.1.0", "retrofit2" : "com.squareup.retrofit2:retrofit:2.4.0", "converter-gson" : "com.squareup.retrofit2:converter-gson:2.4.0", "adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava2:2.4.0", "rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.13", "rxjava2:rxandroid": "io.reactivex.rxjava2:rxandroid:2.0.2", "dagger" : "com.google.dagger:dagger:2.8", "dagger-compiler" : "com.google.dagger:dagger-compiler:2.7" ] }
在主build.gradle中加入一句话
apply from: "config.gradle"
在工程里build.gradle中全部替换成
apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.android.compileSdkVersion defaultConfig { applicationId rootProject.ext.android.applicationId minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation rootProject.ext.dependencies["appcompat-v7"] implementation rootProject.ext.dependencies["constraint-layout"] implementation rootProject.ext.dependencies["retrofit2"] implementation rootProject.ext.dependencies["converter-gson"] implementation rootProject.ext.dependencies["rxjava2"] implementation rootProject.ext.dependencies["rxjava2:rxandroid"] implementation rootProject.ext.dependencies["dagger"] annotationProcessor rootProject.ext.dependencies["dagger-compiler"] implementation rootProject.ext.dependencies["adapter-rxjava"] }
base包
BaseActivity类
package com.example.administrator.myapplication.base; import android.os.Bundle; import android.os.PersistableBundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import com.example.administrator.myapplication.inter.IBase; import javax.inject.Inject; /** * Created by Administrator on 2018/5/8 0008. */ 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() { } }
BaseContract接口
package com.example.administrator.myapplication.base; /** * Created by Administrator on 2018/5/8 0008. */ public interface BaseContract { //抽取所有presenter的共性,例如绑定、解绑 interface BasePresenter<T extends BaseView>{ void attchView(T view); void detachView(); } //抽取所有view共性、例如显示进度条和关闭进度 interface BaseView{ void showLoading(); void dismissLoading(); } }
BasePresenter类
package com.example.administrator.myapplication.base; /** * Created by Administrator on 2018/5/8 0008. */ 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; } } }
inter包
package com.example.administrator.myapplication.inter; /** * Created by Administrator on 2018/5/8 0008. */ public interface IBase { int getContentLayout(); void inject(); }
login包
LoginActivity类
package com.example.administrator.myapplication.login; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.administrator.myapplication.R; import com.example.administrator.myapplication.base.BaseActivity; import com.example.administrator.myapplication.bean.UserBean; import com.example.administrator.myapplication.component.DaggerHttpComponent; import com.example.administrator.myapplication.module.HttpModule; import com.example.administrator.myapplication.reg.RegActivity; import dagger.internal.DaggerCollections; public class LoginActivity extends BaseActivityimplements LoginContract.view { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } /* public void inject(){ DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); }*/ private void initView() { final EditText et_mobile = findViewById(R.id.et_mobile); final EditText et_pass = findViewById(R.id.et_pass); Button login = findViewById(R.id.login); Button reg = findViewById(R.id.reg); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String mobile = et_mobile.getText().toString(); String pass = et_pass.getText().toString(); mPresenter.login(mobile,pass); } }); reg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(LoginActivity.this, RegActivity.class); startActivity(intent); } }); } @Override public int getContentLayout() { return R.layout.activity_login; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } @Override public void loginSuccess(UserBean userBean) { Toast.makeText(LoginActivity.this, userBean.getMsg(), Toast.LENGTH_SHORT).show(); } }
LoginContract接口
package com.example.administrator.myapplication.login; import android.view.View; import com.example.administrator.myapplication.base.BaseContract; import com.example.administrator.myapplication.bean.UserBean; /** * Created by Administrator on 2018/5/8 0008. */ public interface LoginContract { interface view extends BaseContract.BaseView{ void loginSuccess(UserBean userBean); } interface presenter extends BaseContract.BasePresenter{ void login(String mobile, String password); } }
LoginPresenter类
package com.example.administrator.myapplication.login; import android.util.Log; import android.widget.Toast; import com.example.administrator.myapplication.base.BasePresenter; import com.example.administrator.myapplication.bean.UserBean; import com.example.administrator.myapplication.net.LoginApi; import javax.inject.Inject; import io.reactivex.Observer; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; /** * Created by Administrator on 2018/5/8 0008. */ public class LoginPresenter extends BasePresenterimplements 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 () { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(UserBean userBean) { mView.loginSuccess(userBean); } @Override public void onError(Throwable e) { // Toast.makeText(LoginPresenter.this,"", Toast.LENGTH_SHORT).show(); Log.e("zzz","错误"); } @Override public void onComplete() { } }); } }
net包
package com.example.administrator.myapplication.net; /** * Created by Administrator on 2018/5/8 0008. */ public interface API { String BASEURL="https://www.zhaoapi.cn/"; }
package com.example.administrator.myapplication.net; import com.example.administrator.myapplication.bean.RegisterBean; import com.example.administrator.myapplication.bean.UserBean; import io.reactivex.Observable; import retrofit2.http.Field; /** * Created by Administrator on 2018/5/8 0008. */ 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 Observablelogin( String mobile, String password){ return loginApiService.login(mobile,password); } public Observable reg(String mobile, String password) { return loginApiService.reg(mobile, password); } }
package com.example.administrator.myapplication.net; import com.example.administrator.myapplication.bean.RegisterBean; import com.example.administrator.myapplication.bean.UserBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; /** * Created by Administrator on 2018/5/8 0008. */ public interface LoginApiService { @FormUrlEncoded @POST("user/login") Observablelogin(@Field("mobile") String mobile, @Field("password") String password); @FormUrlEncoded @POST("user/reg") Observable reg(@Field("mobile") String mobile, @Field("password") String password); }
package com.example.administrator.myapplication.component; import com.example.administrator.myapplication.login.LoginActivity; import com.example.administrator.myapplication.module.HttpModule; import com.example.administrator.myapplication.reg.RegActivity; import dagger.Component; /** * Created by Administrator on 2018/5/8 0008. */ @Component(modules = HttpModule.class) public interface HttpComponent { void inject(LoginActivity loginActivity); void inject(RegActivity regActivity); }
package com.example.administrator.myapplication.module; import com.example.administrator.myapplication.net.API; import com.example.administrator.myapplication.net.LoginApi; import com.example.administrator.myapplication.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; /** * Created by Administrator on 2018/5/8 0008. */ @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); } }
package com.example.administrator.myapplication.reg; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.administrator.myapplication.R; import com.example.administrator.myapplication.base.BaseActivity; import com.example.administrator.myapplication.component.DaggerHttpComponent; import com.example.administrator.myapplication.module.HttpModule; public class RegActivity extends BaseActivityimplements View.OnClickListener,RegContract.View { private EditText mEtMobile; private EditText mEtPass; /** * 确定注册 */ private Button mQureg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } @Override public int getContentLayout() { return R.layout.activity_reg; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } private void initView() { mEtMobile = (EditText) findViewById(R.id.et_mobile); mEtPass = (EditText) findViewById(R.id.et_pass); mQureg = (Button) findViewById(R.id.qureg); mQureg.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.qureg: String mobile = mEtMobile.getText().toString(); String password = mEtPass.getText().toString(); mPresenter.reg(mobile, password); break; } } @Override public void regSuccess() { Toast.makeText(RegActivity.this, "注册成功", Toast.LENGTH_SHORT).show(); finish(); } }
package com.example.administrator.myapplication.reg; import com.example.administrator.myapplication.base.BaseContract; /** * Created by Administrator on 2018/5/9 0009. */ public interface RegContract { interface View extends BaseContract.BaseView { void regSuccess(); } interface Presenter extends BaseContract.BasePresenter{ void reg(String mobile, String password); } }
package com.example.administrator.myapplication.reg; import com.example.administrator.myapplication.base.BasePresenter; import com.example.administrator.myapplication.bean.RegisterBean; import com.example.administrator.myapplication.net.LoginApi; import javax.inject.Inject; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; /** * Created by Administrator on 2018/5/9 0009. */ public class RegPresenter extends BasePresenterimplements RegContract.Presenter{ LoginApi loginApi; @Inject public RegPresenter(LoginApi loginApi) { this.loginApi=loginApi; } @Override public void reg(String mobile, String password) { loginApi.reg(mobile,password) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer () { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(RegisterBean registerBean) { mView.regSuccess(); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }
package com.example.administrator.myapplication.bean; import java.io.Serializable; public class RegisterBean implements Serializable { /** * msg : 注册成功 * code : 0 */ private String msg; private String code; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
package com.example.administrator.myapplication.bean; public class UserBean { /** * msg : 登录成功 * code : 0 * data : {"age":null,"appkey":"07258a7bbfd8b132","appsecret":"E243E12B205A861F4BBC0492A373A36F", * "createtime":"2018-05-08T09:34:26","email":null,"fans":null,"follow":null,"gender":null,"icon":"https://www * .zhaoapi.cn/images/1525392292327header_crop.jpg","latitude":null,"longitude":null,"mobile":"18310830365", * "money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null, * "token":"5B5E60DC8960BA6DBCF3CBA638A1EC32","uid":1235,"userId":null,"username":"18310830365"} */ private String msg; private String code; private DataBean data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class DataBean { /** * age : null * appkey : 07258a7bbfd8b132 * appsecret : E243E12B205A861F4BBC0492A373A36F * createtime : 2018-05-08T09:34:26 * email : null * fans : null * follow : null * gender : null * icon : https://www.zhaoapi.cn/images/1525392292327header_crop.jpg * latitude : null * longitude : null * mobile : 18310830365 * money : null * nickname : null * password : 8F669074CAF5513351A2DE5CC22AC04C * praiseNum : null * token : 5B5E60DC8960BA6DBCF3CBA638A1EC32 * uid : 1235 * userId : null * username : 18310830365 */ private Object age; private String appkey; private String appsecret; private String createtime; private Object email; private Object fans; private Object follow; private Object gender; private String icon; private Object latitude; private Object longitude; private String mobile; private Object money; private Object nickname; private String password; private Object praiseNum; private String token; private int uid; private Object userId; private String username; public Object getAge() { return age; } public void setAge(Object age) { this.age = age; } public String getAppkey() { return appkey; } public void setAppkey(String appkey) { this.appkey = appkey; } public String getAppsecret() { return appsecret; } public void setAppsecret(String appsecret) { this.appsecret = appsecret; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public Object getEmail() { return email; } public void setEmail(Object email) { this.email = email; } public Object getFans() { return fans; } public void setFans(Object fans) { this.fans = fans; } public Object getFollow() { return follow; } public void setFollow(Object follow) { this.follow = follow; } public Object getGender() { return gender; } public void setGender(Object gender) { this.gender = gender; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Object getLatitude() { return latitude; } public void setLatitude(Object latitude) { this.latitude = latitude; } public Object getLongitude() { return longitude; } public void setLongitude(Object longitude) { this.longitude = longitude; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public Object getMoney() { return money; } public void setMoney(Object money) { this.money = money; } public Object getNickname() { return nickname; } public void setNickname(Object nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Object getPraiseNum() { return praiseNum; } public void setPraiseNum(Object praiseNum) { this.praiseNum = praiseNum; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public Object getUserId() { return userId; } public void setUserId(Object userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } }
activity_login.xml
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.myapplication.login.LoginActivity" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_mobile"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_pass"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/login" android:text="登录" android:layout_weight="1"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/reg" android:layout_weight="1" android:text="注册"/> LinearLayout> LinearLayout>activity_reg.xml
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.myapplication.reg.RegActivity" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_mobile"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_pass"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/qureg" android:text="确定注册"/> LinearLayout>
最后加权限