Android MVP架构搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。有问题联系shouspencercjh@foxmail.com https://blog.csdn.net/weixin_40411846/article/details/83359875

鸣谢

感谢泡在网上的日子用户@JesseBraveMan的两篇关于MVP架构的博文:Android MVP架构搭建Android MVP升级路(二)时尚版

摘要

Android中MVP架构的理论与使用,完整相关项目网站:基于MVP的特色河蟹大赛评比管理系统客户端

开始

用架构和不用架构的区别是非常明显的,我们需要多多利用Java的接口、继承、实现等面向对象思想来让我们越来越大的Android项目更易开发和维护。

环境


    apply plugin: 'com.android.application'
//apply plugin: 'com.jakewharton.butterknife'

android {
compileSdkVersion 27
defaultConfig {
applicationId “top.spencer.crabscore”
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath true
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), proguard-rules.pro
}
}
dataBinding {
enabled true
}
}

dependencies {
implementation fileTree(dir: ‘libs’, include: [’*.jar’])
implementation ‘com.android.support:appcompat-v7:27.0.2’
implementation ‘com.android.support:support-v4:27.1.1’
implementation ‘com.android.support:design:27.1.1’
implementation ‘com.android.support:recyclerview-v7:27.1.1’
implementation ‘com.android.support.constraint:constraint-layout:1.0.2’
testImplementation ‘junit:junit:4.12’
androidTestImplementation ‘com.android.support.test?1.0.1’
androidTestImplementation ‘com.android.support.test.espresso:espresso-core:3.0.1’
// https://mvnrepository.com/artifact/cn.hutool/hutool-core
implementation group: ‘cn.hutool’, name: ‘hutool-core’, version: ‘4.1.18’
// https://mvnrepository.com/artifact/com.alibaba/fastjson
implementation group: ‘com.alibaba’, name: ‘fastjson’, version: ‘1.2.51’
// https://mvnrepository.com/artifact/commons-codec/commons-codec
implementation group: ‘commons-codec’, name: ‘commons-codec’, version: ‘1.11’
//DataBinding
annotationProcessor ‘com.android.databinding:compiler:3.1.2’
//ButterKnife
implementation ‘com.jakewharton:butterknife:8.8.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:8.8.1’
// https://mvnrepository.com/artifact/org.projectlombok/lombok
compileOnly group: ‘org.projectlombok’, name: ‘lombok’, version: ‘1.18.2’
// https://mvnrepository.com/artifact/com.qiniu/qiniu-android-sdk
implementation group: ‘com.qiniu’, name: ‘qiniu-android-sdk’, version: ‘7.3.13’
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt
implementation group: ‘io.jsonwebtoken’, name: ‘jjwt’, version: ‘0.9.1’
// https://mvnrepository.com/artifact/com.github.bumptech.glide/glide
implementation group: ‘com.github.bumptech.glide’, name: ‘glide’, version: ‘4.8.0’
// https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
implementation group: ‘com.squareup.okhttp3’, name: ‘okhttp’, version: ‘3.11.0’
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: ‘com.google.code.gson’, name: ‘gson’, version: ‘2.8.5’
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

别人的话

在MVP 架构中跟MVC类似的是同样也分为三层。

Activity 和Fragment 视为View层,负责处理 UI。

Presenter 为业务处理层,既能调用UI逻辑,又能请求数据,该层为纯Java类,不涉及任何Android API。

Model 层中包含着具体的数据请求,数据源。

三层之间调用顺序为view->presenter->model,为了调用安全着想不可反向调用!不可跨级调用!

那Model 层如何反馈给Presenter 层的呢?Presenter 又是如何操控View 层呢?看图!
在这里插入图片描述
上图中说明了低层的不会直接给上一层做反馈,而是通过 View 、 Callback 为上级做出了反馈,这样就解决了请求数据与更新界面的异步操作。上图中 View 和 Callback 都是以接口的形式存在的,其中 View 是经典 MVP 架构中定义的,Callback 是我自己加的。

View 中定义了 Activity 的具体操作,主要是些将请求到的数据在界面中更新之类的。

Callback 中定义了请求数据时反馈的各种状态:成功、失败、异常等。

我的理解

我就用我自己的话来复述一下这张图吧。
在MVP架构中:
Activity和Fragment只负责UI初始化(组件绑定、组件适配器绑定、组件监听器绑定等等)和UI逻辑变化(这些UI变化的代码都应该是实现图中那个View的接口);
Presenter里写调用数据业务逻辑(网络请求等)和UI逻辑的代码,注意都是**“调用”,而不是具体实现**。
UI逻辑的具体实现在Activity和Fragment里面。
数据业务逻辑的具体实现在Model层里面。
Model层通过CallBack将数据返回给Presenter层。
Presenter层再通过View接口把数据传给Activity和Fragment。
Activity和Fragment拿到数据以后执行相关UI逻辑。
简单地总结就是:只要是和Android组件的实质性业务代码都在Activity和Fragment里,Presenter会通过View来调用。
至于Android MVP升级路(二)时尚版里说的我觉得就是利用Java的反射机制的Model层的优雅实现,。

我的实现

根据以上思想和相关参考作出以下Demo。
在这里插入图片描述
这个example

实现结果

我懒得截图了呃,代码绝对没bug,都调试过了。
在这里插入图片描述
单击登陆会有相关MVP整个流程的调用。

总结

MVP架构的代码量很大,但方便维护和开发,大量公用的东西也可以不用写了。还在不断地学习和使用中,有了心得会继续撰文。

凑页数的源码展示

LoginActivity

package top.spencer.crabscore.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.;
import butterknife.
;
import com.alibaba.fastjson.JSONObject;
import top.spencer.crabscore.R;
import top.spencer.crabscore.base.BaseActivity;
import top.spencer.crabscore.common.CommonConstant;
import top.spencer.crabscore.presenter.LoginPresenter;
import top.spencer.crabscore.util.SharedPreferencesUtil;
import top.spencer.crabscore.view.LoginView;

import static android.content.ContentValues.TAG;

/**

  • @author spencercjh
    */
    @SuppressWarnings({“WeakerAccess”, “unused”})
    public class LoginActivity extends BaseActivity implements LoginView {

    private LoginPresenter loginPresenter;

    @BindView(R.id.edit_username)
    EditText username;
    @BindView(R.id.edit_password)
    EditText password;
    @BindView(R.id.button_login)
    Button login;
    @BindView(R.id.button_register)
    Button register;
    @BindView(R.id.button_forget_password)
    Button forgetPassword;
    @BindView(R.id.spinner_role)
    Spinner roleSpinner;
    @BindArray(R.array.roles)
    String[] roles;
    @BindView(R.id.checkbox_remember_password)
    CheckBox rememberPassword;
    @BindView(R.id.checkbox_auto_login)
    CheckBox autoLogin;

    private int roleChoice = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_login);
    ButterKnife.bind(this);
    loginPresenter = new LoginPresenter();
    loginPresenter.attachView(this);
    SharedPreferencesUtil.getInstance(getContext(), “LOGIN”);
    initSpinner();
    readSharedPreferences();
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    loginPresenter.detachView();
    }

    @Override
    public void initSpinner() {
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, roles);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    roleSpinner.setAdapter(adapter);
    roleSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    Log.d(TAG, “用户组改变”);
    showToast(“用户组改变”);
    roleChoice = pos;
    if (pos CommonConstant.USER_TYPE_ADMIN) {
    SharedPreferencesUtil.putData(CommonConstant.ADMINISTRATOR, true);
    } else if (pos CommonConstant.USER_TYPE_JUDGE) {
    SharedPreferencesUtil.putData(CommonConstant.JUDGE, true);
    } else if (pos CommonConstant.USER_TYPE_STAFF) {
    SharedPreferencesUtil.putData(CommonConstant.STAFF, true);
    } else if (pos CommonConstant.USER_TYPE_COMPANY) {
    SharedPreferencesUtil.putData(CommonConstant.COMPANY, true);
    }
    }

         <span class="token annotation punctuation">@Override</span>
         <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onNothingSelected</span><span class="token punctuation">(</span>AdapterView<span class="token operator">&lt;</span><span class="token operator">?</span><span class="token operator">&gt;</span> parent<span class="token punctuation">)</span> <span class="token punctuation">{</span>
             Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"用户组未改变"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             SharedPreferencesUtil<span class="token punctuation">.</span><span class="token function">putData</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>ADMINISTRATOR<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             SharedPreferencesUtil<span class="token punctuation">.</span><span class="token function">putData</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>JUDGE<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             SharedPreferencesUtil<span class="token punctuation">.</span><span class="token function">putData</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>STAFF<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
             SharedPreferencesUtil<span class="token punctuation">.</span><span class="token function">putData</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>COMPANY<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
     <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    

    }

    @Override
    public void readSharedPreferences() {
    //读取SharedPreferences中的用户组信息
    if (SharedPreferencesUtil.getData(CommonConstant.ADMINISTRATOR, Boolean.FALSE).equals(true)) {
    roleSpinner.setSelection(1);
    roleChoice = 1;
    } else if (SharedPreferencesUtil.getData(CommonConstant.JUDGE, Boolean.FALSE).equals(true)) {
    roleSpinner.setSelection(2);
    roleChoice = 2;
    } else if (SharedPreferencesUtil.getData(CommonConstant.STAFF, Boolean.FALSE).equals(true)) {
    roleSpinner.setSelection(3);
    roleChoice = 3;
    } else if (SharedPreferencesUtil.getData(CommonConstant.COMPANY, Boolean.FALSE).equals(true)) {
    roleSpinner.setSelection(4);
    roleChoice = 4;
    }
    //读取上一次用户选择的用户组
    try {
    roleChoice = (Integer) SharedPreferencesUtil.getData(“ROLE_CHOICE”, roleChoice);
    roleSpinner.setSelection(roleChoice);
    } catch (ClassCastException e) {
    e.printStackTrace();
    }
    //记住密码
    if (SharedPreferencesUtil.getData(CommonConstant.REMEMBER_PASSWORD, false).equals(true)) {
    username.setText((String) SharedPreferencesUtil.getData(“USERNAME”, “”));
    password.setText((String) SharedPreferencesUtil.getData(“PASSWORD”, “”));
    }
    //自动登录
    if (SharedPreferencesUtil.getData(CommonConstant.AUTO_LOGIN, false).equals(true)) {
    loginPresenter.login(username.getText().toString().trim(), password.getText().toString().trim(), String.valueOf(roleChoice));
    }
    }

    @OnCheckedChanged(R.id.checkbox_remember_password)
    public void rememberPassword(CompoundButton buttonView, boolean isChecked) {
    if (isChecked) {
    Log.d(TAG, “记住密码已选中”);
    showToast(“记住密码已选中”);
    SharedPreferencesUtil.putData(“REMEMBER_PASSWORD”, true);
    } else {
    Log.d(TAG, “记住密码没有选中”);
    showToast(“记住密码没有选中”);
    SharedPreferencesUtil.putData(“REMEMBER_PASSWORD”, false);
    }
    }

    @OnCheckedChanged(R.id.checkbox_auto_login)
    public void autoLogin(CompoundButton buttonView, boolean isChecked) {
    if (isChecked) {
    Log.d(TAG, “自动登录已选中”);
    showToast(“自动登录已选中”);
    SharedPreferencesUtil.putData(“AUTO_LOGIN”, true);
    } else {
    Log.d(TAG, “自动登录未选中”);
    showToast(“自动登录未选中”);
    SharedPreferencesUtil.putData(“AUTO_LOGIN”, false);
    }
    }

    @OnClick(R.id.button_login)
    public void login(View view) {
    loginPresenter.login(username.getText().toString().trim(), password.getText().toString().trim(), String.valueOf(roleChoice));
    }

    @OnClick(R.id.button_register)
    public void register(View view) {
    Intent intent = new Intent();
    //TODO 跳转注册活动
    }

    @OnClick(R.id.button_forget_password)
    public void forgetPassword(View view) {
    Intent intent = new Intent();
    //TODO 跳转忘记密码活动
    }

    @Override
    public void showData(JSONObject successData) {
    Toast.makeText(getContext(), successData.getString(“message”), Toast.LENGTH_SHORT).show();
    SharedPreferencesUtil.putData(“USERNAME”, username.getText().toString().trim());
    SharedPreferencesUtil.putData(“PASSWORD”, password.getText().toString().trim());
    Intent intent = new Intent();
    //TODO 跳转主活动
    }

    @Override
    public void showFailure(JSONObject errorData) {
    Toast.makeText(getContext(), errorData.getString(“message”), Toast.LENGTH_SHORT).show();
    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191

activity_login.xml

在这里插入图片描述
后面我寻思着还是得再整个高大上的登陆界面去参赛。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:background="@color/colorPrimary"
                                             tools:context=".activity.LoginActivity">
    <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="@string/please_login_first"
            android:textColor="@color/textcolor" android:textSize="30sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/loginPanel" app:layout_constraintVertical_bias="0.517"/>
    <LinearLayout
            android:id="@+id/loginPanel"
            android:layout_width="327dp"
            android:layout_height="348dp"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="8sp"
            android:layout_marginLeft="8sp"
            android:layout_marginRight="8sp"
        <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>8sp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>background</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@drawable/background_login_div<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>gravity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>orientation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>vertical<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>weightSum</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintBottom_toBottomOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintLeft_toLeftOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintRight_toRightOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintTop_toTopOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintVertical_bias</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.417<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>EditText</span>
            <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/edit_username<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>match_parent<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginLeft</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginRight</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>ems</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>hint</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/请输入您的用户名<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>inputType</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>maxLines</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>selectAllOnFocus</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>textSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>17sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>singleLine</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span>
    <span class="token punctuation">&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>requestFocus</span><span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>EditText</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>EditText</span>
            <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/edit_password<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>match_parent<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginLeft</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginRight</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>50sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>ems</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>hint</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/请输入您的密码<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>inputType</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>textPassword<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>maxLines</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>textSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>17sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>singleLine</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>requestFocus</span><span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>EditText</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>LinearLayout</span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>match_parent<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>100sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_weight</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.25<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>orientation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>vertical<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>weightSum</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">tools:</span>ignore</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>InefficientWeight<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RadioGroup</span>
                <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>match_parent<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrap_content<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>gravity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>center<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>orientation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>horizontal<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>weightSum</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>CheckBox</span>
                    <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/checkbox_remember_password<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>100sp<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>40sp<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/记住密码<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>

            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>CheckBox</span>
                    <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/checkbox_auto_login<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>100sp<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>40sp<span class="token punctuation">"</span></span>
                    <span class="token attr-name"><span class="token namespace">android:</span>text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/自动登录<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>RadioGroup</span><span class="token punctuation">&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Spinner</span>
                <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/spinner_role<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>match_parent<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrap_content<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>layout_weight</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.39<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">android:</span>autofillHints</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sd<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">tools:</span>ignore</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>InefficientWeight,NestedWeights<span class="token punctuation">"</span></span>
                <span class="token attr-name"><span class="token namespace">tools:</span>targetApi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>o<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>LinearLayout</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
            <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/button_login<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>150sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrap_content<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_gravity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>center_horizontal<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20sp<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>background</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@drawable/background_button_div<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/登录<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>textColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@color/white<span class="token punctuation">"</span></span>
            <span class="token attr-name"><span class="token namespace">android:</span>textSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20sp<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>LinearLayout</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
        <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/button_register<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>background</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#00000000<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>117dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>25dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_marginBottom</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>33dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>8dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>textColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@color/textcolor<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintBottom_toBottomOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintHorizontal_bias</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.106<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintLeft_toLeftOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintRight_toRightOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintTop_toTopOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintVertical_bias</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1.0<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/新用户注册点我<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
        <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/button_forget_password<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>background</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#00000000<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>77sp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>25dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_marginBottom</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>33dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>layout_marginTop</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>8dp<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>textColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@color/textcolor<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintBottom_toBottomOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintHorizontal_bias</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.893<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintLeft_toLeftOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintRight_toRightOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintTop_toTopOf</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>parent<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintVertical_bias</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1.0<span class="token punctuation">"</span></span>
        <span class="token attr-name"><span class="token namespace">android:</span>text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@string/忘记密码<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>android.support.constraint.Guideline</span> <span class="token attr-name"><span class="token namespace">android:</span>layout_width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrap_content<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">android:</span>layout_height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>wrap_content<span class="token punctuation">"</span></span>
                                      <span class="token attr-name"><span class="token namespace">android:</span>id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>@+id/guideline<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">app:</span>layout_constraintGuide_begin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20dp<span class="token punctuation">"</span></span>
                                      <span class="token attr-name"><span class="token namespace">android:</span>orientation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>vertical<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>

</android.support.constraint.ConstraintLayout>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161

BaseActivity

package top.spencer.crabscore.base;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import top.spencer.crabscore.R;

/**

  • @author spencercjh
    */
    @SuppressWarnings(“deprecation”)
    public abstract class BaseActivity extends AppCompatActivity implements BaseView {

    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mProgressDialog = new ProgressDialog(this);
    mProgressDialog.setCancelable(false);
    }

    @Override
    public void showLoading() {
    if (!mProgressDialog.isShowing()) {
    mProgressDialog.show();
    }
    }

    @Override
    public void hideLoading() {
    if (mProgressDialog.isShowing()) {
    mProgressDialog.dismiss();
    }
    }

    @Override
    public void showToast(String msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showErr() {
    showToast(getResources().getString(R.string.api_sever_error_msg));
    }

    @Override
    public Context getContext() {
    return BaseActivity.this;
    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

LoginView

package top.spencer.crabscore.view;

import top.spencer.crabscore.base.BaseView;

/**

  • @author spencercjh
    /
    public interface LoginView extends BaseView {
    /
    *

    • 初始化用户组Spinner
      */
      void initSpinner();

    /**

    • 读取SharedPreferences,执行相关业务逻辑
      */
      void readSharedPreferences();
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

BaseView

package top.spencer.crabscore.base;

import android.content.Context;
import com.alibaba.fastjson.JSONObject;

/**

  • @author spencercjh
    /
    public interface BaseView {
    /
    *

    • 当数据请求成功后,调用此接口显示数据
    • @param successData 成功数据源
      */
      void showData(JSONObject successData);

    /**

    • 显示正在加载view
      */
      void showLoading();

    /**

    • 关闭正在加载view
      */
      void hideLoading();

    /**

    • 显示提示
    • @param msg Toast message
      */
      void showToast(String msg);

    /**

    • 显示失败
    • @param errorData 错误数据源
      */
      void showFailure(JSONObject errorData);

    /**

    • 显示请求错误提示
      */
      void showErr();

    /**

    • 获取上下文
    • @return 上下文
      */
      Context getContext();
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

LoginPresenter

package top.spencer.crabscore.presenter;

import com.alibaba.fastjson.JSONObject;
import top.spencer.crabscore.base.BasePresenter;
import top.spencer.crabscore.data.Callback;
import top.spencer.crabscore.data.constant.Token;
import top.spencer.crabscore.data.model.DataModel;
import top.spencer.crabscore.view.LoginView;

/**

  • @author spencercjh
    */
    public class LoginPresenter extends BasePresenter<LoginView> {

    /**

    • 登陆请求

    • @param username 用户名

    • @param password 密码

    • @param roleId 用户组(1、2、3、4)
      */
      public void login(String username, String password, String roleId) {

      if (!isViewAttached()) {
      //如果没有View引用就不加载数据
      return;
      }
      //显示正在加载进度条
      getView().showLoading();
      DataModel
      // 设置请求标识token
      .request(Token.API_LOGIN)
      // 添加请求参数,没有则不添加`
      .params(username, password, roleId)
      // 注册监听回调
      .execute(new Callback<JSONObject>() {
      @Override
      public void onSuccess(JSONObject data) {
      //调用view接口显示数据,在具体的Activity中被重载
      getView().showData(data);
      }

               <span class="token annotation punctuation">@Override</span>
               <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onFailure</span><span class="token punctuation">(</span>JSONObject data<span class="token punctuation">)</span> <span class="token punctuation">{</span>
                   <span class="token comment">//调用view接口提示失败信息,在具体的Activity中被重载</span>
                   <span class="token function">getView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">showFailure</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token punctuation">}</span>
      
               <span class="token annotation punctuation">@Override</span>
               <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                   <span class="token comment">//调用view接口提示请求异常,在BaseActivity中已经实现</span>
                   <span class="token function">getView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">showErr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token punctuation">}</span>
      
               <span class="token annotation punctuation">@Override</span>
               <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                   <span class="token comment">// 隐藏正在加载进度条,在BaseActivity中已经实现</span>
                   <span class="token function">getView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">hideLoading</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token punctuation">}</span>
           <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      

    }
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

BasePresenter

package top.spencer.crabscore.base;

/**

  • @author spencercjh
    */
    public class BasePresenter<V extends BaseView> {

    /**

    • 绑定的view
      */
      private V mvpView;

    /**

    • 绑定view,一般在初始化中调用该方法
      */
      public void attachView(V view) {
      this.mvpView = view;
      }

    /**

    • 断开view,一般在onDestroy中调用
      */
      public void detachView() {
      this.mvpView = null;
      }

    /**

    • 是否与View建立连接
    • 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接
      */
      public boolean isViewAttached() {
      return mvpView != null;
      }

    /**

    • 获取连接的view
      */
      public V getView() {
      return mvpView;
      }
      }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

DataModel

package top.spencer.crabscore.data.model;

import android.util.Log;
import top.spencer.crabscore.base.BaseModel;

import static android.content.ContentValues.TAG;

/**

  • @author spencercjh
    */
    public class DataModel {
    public static BaseModel request(String token) {
    // 声明一个空的BaseModel
    BaseModel model = null;
    try {
    //利用反射机制获得对应Model对象的引用
    model = (BaseModel) Class.forName(token).newInstance();
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
    Log.e(TAG, “Model反射错误”);
    }
    return model;
    }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

LoginModel

这里校验参数的返回错误信息写得有点呆,不太会解决了。后面要传JSONObject获取,这边只要String。我觉得哪边改其实都一样吧:都改成String以后后面就要增加转JSONObject的代码。

package top.spencer.crabscore.data.model;

import android.content.Intent;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import top.spencer.crabscore.base.BaseModel;
import top.spencer.crabscore.data.Callback;
import top.spencer.crabscore.common.CommonConstant;

/**

  • 调用Login接口的Model层
  • @author spencercjh
    */
    public class LoginModel extends BaseModel {
    @Override
    public void execute(final Callback<JSONObject> myCallBack) {
    if (StrUtil.isEmpty(mvpParams[0])) {
    String result = “{“code”:501,“message”:“用户名不能为空”,“result”:{},“success”:false,“timestamp”:0}”;
    JSONObject resultJson = JSON.parseObject(result);
    myCallBack.onFailure(resultJson);
    myCallBack.onComplete();
    return;
    } else if (StrUtil.isEmpty(mvpParams[1])) {
    String result = “{“code”:501,“message”:“密码不能为空”,“result”:{},“success”:false,“timestamp”:0}”;
    JSONObject resultJson = JSON.parseObject(result);
    myCallBack.onFailure(resultJson);
    myCallBack.onComplete();
    return;
    } else if (Integer.parseInt(mvpParams[2]) == 0) {
    String result = “{“code”:501,“message”:“用户组不能不选择”,“result”:{},“success”:false,“timestamp”:0}”;
    JSONObject resultJson = JSON.parseObject(result);
    myCallBack.onFailure(resultJson);
    myCallBack.onComplete();
    return;
    }
    String url = CommonConstant.URL + “common/login” + “?username=” + mvpParams[0] +
    “&password=” + DigestUtils.md5Hex(mvpParams[1]) +
    “&roleId=” + mvpParams[2];
    //login接口JWT为空,返回会拿到一个JWT,JWT是放在ResponseBody里的,再下次请求时要把JWT放进RequestHeader
    requestGetAPI(url, myCallBack, “”);
    }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

BaseModel

这里把REST请求都实现了。

package top.spencer.crabscore.base;

import android.support.annotation.NonNull;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import top.spencer.crabscore.common.CommonConstant;
import top.spencer.crabscore.data.Callback;

import java.io.IOException;
import java.util.Map;

import static android.content.ContentValues.TAG;

/**

  • @author spencercjh
    /
    @SuppressWarnings(“Duplicates”)
    public abstract class BaseModel {
    /
    *

    • 数据请求参数
      */
      protected String[] mvpParams;

    /**

    • 设置数据请求参数
    • @param args 参数数组
      */
      public BaseModel params(String... args) {
      mvpParams = args;
      return this;
      }

    /**

    • 具体的数据请求由子类实现
    • @param myCallBack myCallBack
      */
      public abstract void execute(Callback<JSONObject> myCallBack);

    /**

    • OkHttp3 异步Get请求

    • @param url URL (需要在外面处理好)

    • @param myCallBack myCallBack

    • @param jwt Header里的JWT串
      */
      protected void requestGetAPI(String url, final Callback<JSONObject> myCallBack, String jwt) {
      OkHttpClient okHttpClient = new OkHttpClient();
      Request request = new Request.Builder()
      .url(url)
      .get()
      .addHeader(“jwt”, jwt)
      .build();
      okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {
      @Override
      public void onFailure(@NonNull Call call, @NonNull IOException e) {
      Log.d(TAG, "onFailure: " + e.getMessage());
      myCallBack.onError();
      myCallBack.onComplete();
      }

       <span class="token annotation punctuation">@Override</span>
       <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onResponse</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Call call<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Response response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
           String jwt <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">headers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           JSONObject responseJsonResult<span class="token punctuation">;</span>
           <span class="token keyword">try</span> <span class="token punctuation">{</span>
               <span class="token keyword">assert</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">;</span>
               Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">,</span> jwt<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> NullPointerException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
               e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token keyword">return</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           Integer code <span class="token operator">=</span> responseJsonResult<span class="token punctuation">.</span><span class="token function">getInteger</span><span class="token punctuation">(</span><span class="token string">"code"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token keyword">if</span> <span class="token punctuation">(</span>code<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>SUCCESS<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onSuccess</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onFailure</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
       <span class="token punctuation">}</span>
      

      });
      }

    /**

    • OkHttp3 Post异步方式提交表单

    • @param url URL

    • @param postParams body中的参数

    • @param myCallBack myCallBack

    • @param jwt Header里的JWT串
      */
      protected void requestPostAPI(String url, Map<String, Object> postParams,
      final Callback<JSONObject> myCallBack, String jwt) {
      OkHttpClient okHttpClient = new OkHttpClient();
      FormBody.Builder formBody = new FormBody.Builder();
      for (Map.Entry<String, Object> param : postParams.entrySet()) {
      formBody.add(param.getKey(), param.getValue().toString());
      }
      RequestBody requestBody = formBody.build();
      Request request = new Request.Builder()
      .url(url)
      .post(requestBody)
      .addHeader(“jwt”, jwt)
      .build();
      okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {
      @Override
      public void onFailure(@NonNull Call call, @NonNull IOException e) {
      Log.d(TAG, "onFailure: " + e.getMessage());
      myCallBack.onError();
      myCallBack.onComplete();
      }

       <span class="token annotation punctuation">@Override</span>
       <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onResponse</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Call call<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Response response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
           String jwt <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">headers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           JSONObject responseJsonResult<span class="token punctuation">;</span>
           <span class="token keyword">try</span> <span class="token punctuation">{</span>
               <span class="token keyword">assert</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">;</span>
               Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">,</span> jwt<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> NullPointerException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
               e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token keyword">return</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           Integer code <span class="token operator">=</span> responseJsonResult<span class="token punctuation">.</span><span class="token function">getInteger</span><span class="token punctuation">(</span><span class="token string">"code"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token keyword">if</span> <span class="token punctuation">(</span>code<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>SUCCESS<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onSuccess</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onFailure</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
       <span class="token punctuation">}</span>
      

      });
      }

    /**

    • OkHttp3 PUT异步请求

    • @param url URL

    • @param putParams body中的参数

    • @param myCallBack myCallBack

    • @param jwt Header里的JWT串
      */
      protected void requestPutAPI(String url, Map<String, Object> putParams,
      final Callback<JSONObject> myCallBack, String jwt) {
      OkHttpClient okHttpClient = new OkHttpClient();
      FormBody.Builder formBody = new FormBody.Builder();
      for (Map.Entry<String, Object> param : putParams.entrySet()) {
      formBody.add(param.getKey(), param.getValue().toString());
      }
      RequestBody requestBody = formBody.build();
      Request request = new Request.Builder()
      .url(url)
      .put(requestBody)
      .addHeader(“jwt”, jwt)
      .build();
      okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {

       <span class="token annotation punctuation">@Override</span>
       <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onFailure</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Call call<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> IOException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
           Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"onFailure: "</span> <span class="token operator">+</span> e<span class="token punctuation">.</span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
       <span class="token punctuation">}</span>
      
       <span class="token annotation punctuation">@Override</span>
       <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onResponse</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Call call<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Response response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
           String jwt <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">headers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           JSONObject responseJsonResult<span class="token punctuation">;</span>
           <span class="token keyword">try</span> <span class="token punctuation">{</span>
               <span class="token keyword">assert</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">;</span>
               Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">,</span> jwt<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> NullPointerException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
               e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token keyword">return</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           Integer code <span class="token operator">=</span> responseJsonResult<span class="token punctuation">.</span><span class="token function">getInteger</span><span class="token punctuation">(</span><span class="token string">"code"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token keyword">if</span> <span class="token punctuation">(</span>code<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>SUCCESS<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onSuccess</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onFailure</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
       <span class="token punctuation">}</span>
      

      });
      }

    /**

    • OkHttp3 Delete异步请求

    • @param url URL (需要在外面处理好)

    • @param myCallBack myCallBack

    • @param jwt Header里的JWT串
      */
      protected void requestDeleteAPI(String url, final Callback<JSONObject> myCallBack, String jwt) {
      OkHttpClient okHttpClient = new OkHttpClient();
      Request request = new Request.Builder()
      .url(url)
      .delete()
      .addHeader(“jwt”, jwt)
      .build();
      okHttpClient.newCall(request).enqueue(new okhttp3.Callback() {
      @Override
      public void onFailure(@NonNull Call call, @NonNull IOException e) {
      Log.d(TAG, "onFailure: " + e.getMessage());
      myCallBack.onError();
      myCallBack.onComplete();
      }

       <span class="token annotation punctuation">@Override</span>
       <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onResponse</span><span class="token punctuation">(</span><span class="token annotation punctuation">@NonNull</span> Call call<span class="token punctuation">,</span> <span class="token annotation punctuation">@NonNull</span> Response response<span class="token punctuation">)</span> <span class="token punctuation">{</span>
           String jwt <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">headers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           JSONObject responseJsonResult<span class="token punctuation">;</span>
           <span class="token keyword">try</span> <span class="token punctuation">{</span>
               <span class="token keyword">assert</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> null<span class="token punctuation">;</span>
               Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">body</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               responseJsonResult<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"jwt"</span><span class="token punctuation">,</span> jwt<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> <span class="token operator">|</span> NullPointerException e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
               e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onError</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
               <span class="token keyword">return</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           Integer code <span class="token operator">=</span> responseJsonResult<span class="token punctuation">.</span><span class="token function">getInteger</span><span class="token punctuation">(</span><span class="token string">"code"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token keyword">if</span> <span class="token punctuation">(</span>code<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>CommonConstant<span class="token punctuation">.</span>SUCCESS<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onSuccess</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
               myCallBack<span class="token punctuation">.</span><span class="token function">onFailure</span><span class="token punctuation">(</span>responseJsonResult<span class="token punctuation">)</span><span class="token punctuation">;</span>
           <span class="token punctuation">}</span>
           myCallBack<span class="token punctuation">.</span><span class="token function">onComplete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
       <span class="token punctuation">}</span>
      

      });
      }
      }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250

Callback

package top.spencer.crabscore.data;

/**

  • @author spencercjh
    */
    public interface Callback<T> {

    /**

    • 数据请求成功
    • @param data 请求到的数据
      */
      void onSuccess(T data);

    /**

    • 使用网络API接口请求方式时,虽然已经请求成功但是由
    • 于{@code msg}的原因无法正常返回数据。
    • @param data 失败数据
      */
      void onFailure(T data);

    /**

    • 请求数据失败,指在请求网络API接口请求方式时,出现无法联网、
    • 缺少权限,内存泄露等原因导致无法连接到请求数据源。
      */
      void onError();

    /**

    • 当请求数据结束时,无论请求结果是成功,失败或是抛出异常都会执行此方法给用户做处理,通常做网络
    • 请求时可以在此处隐藏“正在加载”的等待控件
      */
      void onComplete();

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

Token

package top.spencer.crabscore.data.constant;

import top.spencer.crabscore.data.model.LoginModel;

/**

  • 具体Model类,常量用于反射
  • @author spencercjh
    */
    public class Token {
    public static final String API_LOGIN = LoginModel.class.getName();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

SharedPreferencesUtil

这个工具类挺有用的。

package top.spencer.crabscore.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.google.gson.*;

import java.util.*;

/**

@SuppressWarnings(“unused”)
public class SharedPreferencesUtil {

<span class="token keyword">private</span> <span class="token keyword">static</span> SharedPreferencesUtil util<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> SharedPreferences sp<span class="token punctuation">;</span>

<span class="token keyword">private</span> <span class="token function">SharedPreferencesUtil</span><span class="token punctuation">(</span>Context context<span class="token punctuation">,</span> String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    sp <span class="token operator">=</span> context<span class="token punctuation">.</span><span class="token function">getSharedPreferences</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> Context<span class="token punctuation">.</span>MODE_PRIVATE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/**
 * 初始化SharedPreferencesUtil,只需要初始化一次,建议在Application中初始化
 *
 * @param context 上下文对象
 * @param name    SharedPreferences Name
 */</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">getInstance</span><span class="token punctuation">(</span>Context context<span class="token punctuation">,</span> String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>util <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        util <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SharedPreferencesUtil</span><span class="token punctuation">(</span>context<span class="token punctuation">,</span> name<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token comment">/**
 * 保存数据到SharedPreferences
 *
 * @param key   键
 * @param value 需要保存的数据
 * @return 保存结果
 */</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">boolean</span> <span class="token function">putData</span><span class="token punctuation">(</span>String key<span class="token punctuation">,</span> Object value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">boolean</span> result<span class="token punctuation">;</span>
    SharedPreferences<span class="token punctuation">.</span>Editor editor <span class="token operator">=</span> sp<span class="token punctuation">.</span><span class="token function">edit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    String type <span class="token operator">=</span> value<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getSimpleName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">try</span> <span class="token punctuation">{</span>
        <span class="token keyword">switch</span> <span class="token punctuation">(</span>type<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">case</span> <span class="token string">"Boolean"</span><span class="token operator">:</span>
                editor<span class="token punctuation">.</span><span class="token function">putBoolean</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token punctuation">(</span>Boolean<span class="token punctuation">)</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">case</span> <span class="token string">"Long"</span><span class="token operator">:</span>
                editor<span class="token punctuation">.</span><span class="token function">putLong</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token punctuation">(</span>Long<span class="token punctuation">)</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">case</span> <span class="token string">"Float"</span><span class="token operator">:</span>
                editor<span class="token punctuation">.</span><span class="token function">putFloat</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token punctuation">(</span>Float<span class="token punctuation">)</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">case</span> <span class="token string">"String"</span><span class="token operator">:</span>
                editor<span class="token punctuation">.</span><span class="token function">putString</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token punctuation">(</span>String<span class="token punctuation">)</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">case</span> <span class="token string">"Integer"</span><span class="token operator">:</span>
                editor<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token punctuation">(</span>Integer<span class="token punctuation">)</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
                <sp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值