//有些我们不需要
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RESTART_PACKAGES"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 获取网络状态 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 获取wifi状态 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 改变wifi状态 --> <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 读取sd卡 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.BATTERY_STATS"/> <!-- 获取电池信息 --> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <!-- 设置系统权限 --> <uses-permission android:name="android.permission.GET_TASKS"/> <!-- 设置系统权限 --> <uses-permission android:name="android.permission.WAKE_LOCK"/> <!-- 电源锁权限 --> <uses-permission android:name="android.permission.CAMERA"/> <!-- 允许应用写(非读)用户的日历数据 --> <uses-permission android:name="android.permission.VIBRATE"/> <!-- 允许应用访问震动器 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
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"] implementation 'com.facebook.fresco:fresco:0.12.0' // 支持 GIF 动图,需要添加 implementation 'com.facebook.fresco:animated-gif:0.12.0' implementation 'com.android.support:support-v4:27.1.1'
activity_register.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.register.RegisterActivity"> <EditText android:id="@+id/etMobile" android:layout_width="match_parent" android:layout_height="wrap_content"/> <EditText android:id="@+id/etPassword" android:layout_width="match_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册"/> </LinearLayout>
bean
RegisterBean
package com.example.a1512qmvp2.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; } }
component
HttpComponent
package com.example.a1512qmvp2.component; import com.example.a1512qmvp2.module.HttpModule; import com.example.a1512qmvp2.ui.register.RegisterActivity; import dagger.Component; @Component(modules = HttpModule.class) public interface HttpComponent { void inject(RegisterActivity registerActivity); }
inter
IBase
package com.example.a1512qmvp2.inter; public interface IBase { int getContentLayout(); void inject(); }
module
HttpModule
package com.example.a1512qmvp2.module; import com.example.a1512qmvp2.net.RegisterApi; import com.example.a1512qmvp2.net.RegisterApiService; 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) .readTimeout(20, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS); } @Provides RegisterApi provideRegisterApi(OkHttpClient.Builder builder) { RegisterApiService registerApiService = new Retrofit.Builder() .baseUrl("https://www.zhaoapi.cn/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(builder.build()) .build() .create(RegisterApiService.class); return RegisterApi.getRegisterApi(registerApiService); } }
net
RegisterApi
package com.example.a1512qmvp2.net; import com.example.a1512qmvp2.bean.RegisterBean; import io.reactivex.Observable; public class RegisterApi { private static RegisterApi registerApi; private RegisterApiService registerApiService; private RegisterApi(RegisterApiService registerApiService) { this.registerApiService = registerApiService; } public static RegisterApi getRegisterApi(RegisterApiService registerApiService) { if (registerApi == null) { registerApi = new RegisterApi(registerApiService); } return registerApi; } public Observable<RegisterBean> register(String mobile, String password) { return registerApiService.register(mobile, password); } }
RegisterApiService
package com.example.a1512qmvp2.net; import com.example.a1512qmvp2.bean.RegisterBean; import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; public interface RegisterApiService { @FormUrlEncoded @POST("user/reg") Observable<RegisterBean> register(@Field("mobile") String mobile, @Field("password") String password); }
ui
base
BaseActivity
package com.example.a1512qmvp2.ui.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import com.example.a1512qmvp2.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.attachView(this); } @Override protected void onDestroy() { super.onDestroy(); mPresenter.detachView(); } @Override public void showLoading() { } @Override public void dimissLoading() { } }
BaseContract
package com.example.a1512qmvp2.ui.base; public interface BaseContract { interface BasePresenter<T extends BaseView> { void attachView(T view); void detachView(); } interface BaseView { void showLoading(); void dimissLoading(); } }
BasePresenter
package com.example.a1512qmvp2.ui.base; public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> { protected T mView; @Override public void attachView(T view) { this.mView = view; } @Override public void detachView() { if (mView != null) { mView = null; } } }
register
contract
RegisterContract
package com.example.a1512qmvp2.ui.register.contract; import com.example.a1512qmvp2.ui.base.BaseContract; public interface RegisterContract { interface View extends BaseContract.BaseView { void registerSuccess(); } interface Presenter extends BaseContract.BasePresenter<View> { void register(String mobile, String password); } }
presenter
RegisterPresenter
package com.example.a1512qmvp2.ui.register.presenter; import com.example.a1512qmvp2.bean.RegisterBean; import com.example.a1512qmvp2.net.RegisterApi; import com.example.a1512qmvp2.ui.base.BasePresenter; import com.example.a1512qmvp2.ui.register.contract.RegisterContract; 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 RegisterPresenter extends BasePresenter<RegisterContract.View> implements RegisterContract.Presenter { RegisterApi registerApi; @Inject public RegisterPresenter(RegisterApi registerApi) { this.registerApi = registerApi; } @Override public void register(String mobile, String password) { registerApi.register(mobile, password) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<RegisterBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(RegisterBean registerBean) { mView.registerSuccess(); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }
RegisterActivity
package com.example.a1512qmvp2.ui.register; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.a1512qmvp2.R; import com.example.a1512qmvp2.component.DaggerHttpComponent; import com.example.a1512qmvp2.module.HttpModule; import com.example.a1512qmvp2.ui.base.BaseActivity; import com.example.a1512qmvp2.ui.register.contract.RegisterContract; import com.example.a1512qmvp2.ui.register.presenter.RegisterPresenter; public class RegisterActivity extends BaseActivity<RegisterPresenter> implements RegisterContract.View, View .OnClickListener { private EditText mEtMobile; private EditText mEtPassword; /** * 注册 */ private Button mBt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } @Override public int getContentLayout() { return R.layout.activity_register; } @Override public void inject() { DaggerHttpComponent.builder() .httpModule(new HttpModule()) .build() .inject(this); } @Override public void registerSuccess() { Toast.makeText(RegisterActivity.this, "注册回调了", Toast.LENGTH_SHORT).show(); } private void initView() { mEtMobile = (EditText) findViewById(R.id.etMobile); mEtPassword = (EditText) findViewById(R.id.etPassword); mBt = (Button) findViewById(R.id.bt); mBt.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt: String mobile = mEtMobile.getText().toString(); String password = mEtPassword.getText().toString(); mPresenter.register(mobile, password); break; } } }
MainActivity
package com.example.a1512qmvp2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }