<uses-permission android:name="android.permission.INTERNET"/>
implementation "com.squareup.retrofit2:retrofit:2.4.0" implementation "com.squareup.retrofit2:converter-gson:2.4.0" implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0" implementation "io.reactivex.rxjava2:rxjava:2.1.13" implementation "io.reactivex.rxjava2:rxandroid:2.0.2" implementation 'com.youth.banner:banner:1.4.9' implementation "com.google.dagger:dagger:2.8" annotationProcessor 'com.google.dagger:dagger-compiler:2.7'
bean
UserBean
package com.example.asus.yd1512qjddemo.bean; public class UserBean { /** * msg : 登录成功 * code : 0 * data : {"age":null,"appkey":"032860bad4c453c0","appsecret":"D1D54601A094983A38000563A1ECC720","createtime":"2018-05-21T22:11:47","email":null,"fans":null,"follow":null,"gender":null,"icon":null,"latitude":null,"longitude":null,"mobile":"15133044161","money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null,"token":"C55773B10ABD8BFB6739BD5C16D6F803","uid":11068,"userId":null,"username":"15133044161"} */ 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 : 032860bad4c453c0 * appsecret : D1D54601A094983A38000563A1ECC720 * createtime : 2018-05-21T22:11:47 * email : null * fans : null * follow : null * gender : null * icon : null * latitude : null * longitude : null * mobile : 15133044161 * money : null * nickname : null * password : 8F669074CAF5513351A2DE5CC22AC04C * praiseNum : null * token : C55773B10ABD8BFB6739BD5C16D6F803 * uid : 11068 * userId : null * username : 15133044161 */ 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 Object 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 Object getIcon() { return icon; } public void setIcon(Object 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; } } }
component
HttpComponent
package com.example.asus.yd1512qjddemo.component; import com.example.asus.yd1512qjddemo.model.HttpModule; import com.example.asus.yd1512qjddemo.ui.login.LoginActivity; import dagger.Component; @Component(modules = HttpModule.class) public interface HttpComponent { void inject(LoginActivity loginActivity); }
inter
IBase
package com.example.asus.yd1512qjddemo.inter; import android.view.View; public interface IBase { int getContentLayout(); void inject(); void initView(View view); }
model
HttpModule
package com.example.asus.yd1512qjddemo.model; import com.example.asus.yd1512qjddemo.net.Api; import com.example.asus.yd1512qjddemo.net.LoginApi; import com.example.asus.yd1512qjddemo.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 OkHttpClient.Builder provideOkHttpClientBuilder(){ return new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(20,TimeUnit.SECONDS) .readTimeout(20,TimeUnit.SECONDS); } @Provides LoginApi provideLoginApi(OkHttpClient.Builder builder){ Retrofit retrofit=new Retrofit.Builder() .baseUrl(Api.LoginApiUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(builder.build()) .build(); LoginApiService service = retrofit.create(LoginApiService.class); return LoginApi.getLoginApi(service); } }
net
Api
package com.example.asus.yd1512qjddemo.net; public interface Api { String LoginApiUrl="https://www.zhaoapi.cn/"; }
LoginApi
package com.example.asus.yd1512qjddemo.net; import com.example.asus.yd1512qjddemo.bean.UserBean; import io.reactivex.Observable; public class LoginApi { private static LoginApi loginApi; private LoginApiService loginApiService; public 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); } }
LoginApiService
package com.example.asus.yd1512qjddemo.net; import com.example.asus.yd1512qjddemo.bean.UserBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; public interface LoginApiService { @FormUrlEncoded @POST("user/login") Observable<UserBean> login(@Field("mobile") String mobile,@Field("password") String password); }
ui
base
BaseActivity
package com.example.asus.yd1512qjddemo.ui.base; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.example.asus.yd1512qjddemo.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(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentLayout()); inject(); //绑定 mPresenter.attchView(this); } @Override public void initView(View view) { } @Override protected void onDestroy() { super.onDestroy(); //解绑 mPresenter.detachView(); } public void showLoading(){ } public void dismissLoading(){ } }
BaseContract
package com.example.asus.yd1512qjddemo.ui.base; 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.asus.yd1512qjddemo.ui.base; import com.example.asus.yd1512qjddemo.ui.login.contract.LoginContract; //所有Presenter的积累,实现了BaseContract.BasePresenter接口 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; } } }
login
contract
LoginContract
package com.example.asus.yd1512qjddemo.ui.login.contract; import com.example.asus.yd1512qjddemo.bean.UserBean; import com.example.asus.yd1512qjddemo.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); } }
presenter
LoginPresenter
package com.example.asus.yd1512qjddemo.ui.login.presenter; import com.example.asus.yd1512qjddemo.bean.UserBean; import com.example.asus.yd1512qjddemo.net.LoginApi; import com.example.asus.yd1512qjddemo.ui.base.BasePresenter; import com.example.asus.yd1512qjddemo.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() { } }); } }
LoginActivity
package com.example.asus.yd1512qjddemo.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.asus.yd1512qjddemo.R; import com.example.asus.yd1512qjddemo.bean.UserBean; import com.example.asus.yd1512qjddemo.component.DaggerHttpComponent; import com.example.asus.yd1512qjddemo.model.HttpModule; import com.example.asus.yd1512qjddemo.ui.base.BaseActivity; import com.example.asus.yd1512qjddemo.ui.login.contract.LoginContract; import com.example.asus.yd1512qjddemo.ui.login.presenter.LoginPresenter; public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View, View.OnClickListener { private EditText mEdMobile; private EditText mEdPassword; /** * 登录 */ private Button mBtButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } @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_LONG).show(); } private void initView() { mEdMobile = (EditText) findViewById(R.id.ed_mobile); mEdPassword = (EditText) findViewById(R.id.ed_password); mBtButton = (Button) findViewById(R.id.bt_button); mBtButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt_button: String mobile = mEdMobile.getText().toString(); String password = mEdPassword.getText().toString(); mPresenter.login(mobile,password); break; } } }
MainActivity
package com.example.asus.yd1512qjddemo.ui; import android.os.Bundle; import com.example.asus.yd1512qjddemo.R; import com.example.asus.yd1512qjddemo.ui.base.BaseActivity; import com.example.asus.yd1512qjddemo.ui.base.BasePresenter; import com.example.asus.yd1512qjddemo.ui.login.contract.LoginContract; public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public int getContentLayout() { return R.layout.activity_main; } @Override public void inject() { } }
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" android:orientation="vertical" tools:context=".ui.login.LoginActivity"> <EditText android:id="@+id/ed_mobile" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/ed_password" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/bt_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录"/> </LinearLayout>
build
很重要