base
1、BaseActivity
package com.example.android_mvp.base;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.android_mvp.MainActivity;
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView {
protected final String TAG = this.getClass().getSimpleName();
public View mViewStatusBar;
public Activity mContext;
protected P mPresenter;
protected abstract P createPresenter();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置竖屏模式
mContext = this;
setContentView(getLayoutId());
mPresenter = createPresenter();
// ButterKnife.bind(this);
this.initData();
}
/**
* 获取布局ID
*
* @return
*/
protected abstract int getLayoutId();
/**
* 数据初始化操作
*/
protected abstract void initData();
@Override
protected void onDestroy() {
super.onDestroy();
// ButterKnife.bind(this).unbind();
if (mPresenter != null) {
mPresenter.detachView();
}
}
public void finishActivity() {
finish();
}
/**
* [页面跳转]
*
* @param clz
*/
public void startActivity(Class<?> clz) {
startActivity(clz, null);
}
/**
* [携带数据的页面跳转]
*
* @param clz
* @param bundle
*/
public void startActivity(Class<?> clz, Bundle bundle) {
Intent intent = new Intent();
intent.setClass(this, clz);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
}
/**
* [含有Bundle通过Class打开编辑界面]
*
* @param cls
* @param bundle
* @param requestCode
*/
public void startActivityForResult(Class<?> cls, Bundle bundle, int requestCode) {
Intent intent = new Intent();
intent.setClass(this, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
}
2、BasePresenter
package com.example.android_mvp.base;
public class BasePresenter<V extends BaseView> {
/**
* 绑定的view
*/
private V mvpView;
/**
* 绑定view,一般在初始化中调用该方法
*/
public void attachView(V mvpView) {
this.mvpView = mvpView;
}
/**
* 断开view,一般在onDestroy中调用
*/
public void detachView() {
this.mvpView = null;
}
/**
* 是否与View建立连接
* 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接
*/
public boolean isViewAttached() {
return mvpView != null;
}
/**
* 获取连接的view
*/
public V getView() {
return mvpView;
}
}
3、BaseView
package com.example.android_mvp.base;
import android.content.Context;
public interface BaseView {
/**
* 显示正在加载view
*/
void showLoading();
/**
* 关闭正在加载view
*/
void hideLoading();
}
4、MainActivity
package com.example.android_mvp;
import com.example.android_mvp.base.BaseActivity;
import com.example.android_mvp.base.BasePresenter;
public class MainActivity extends BaseActivity implements MainView {
@Override
public void showData(String data) {
}
@Override
public void showEmpty(String msg) {
}
@Override
protected BasePresenter createPresenter() {
return null;
}
@Override
protected int getLayoutId() {
return 0;
}
@Override
protected void initData() {
}
@Override
public void showLoading() {
}
@Override
public void hideLoading() {
}
}
5、MainPresenter
package com.example.android_mvp;
import com.example.android_mvp.base.BasePresenter;
public class MainPresenter extends BasePresenter {
// View接口
private MainView mView;
public MainPresenter(MainView mView) {
this.mView = mView;
}
/**
*
* @param params
*/
public void getData(String params){
MainModel.getData(params, new RequestListener() {
@Override
public void onSuccess(String data) {
mView.showData(data);
}
@Override
public void onFailure(String msg) {
}
@Override
public void onError() {
}
@Override
public void onComplete() {
}
});
}
}
6、MainView
package com.example.android_mvp;
public interface MainView {
/**
* 当数据请求成功后,调用此接口显示数据
* @param data 数据源
*/
void showData(String data);
/**
* 当数据请求失败后,调用此接口提示
* @param msg 失败原因
*/
void showEmpty(String msg);
}
7、callback
package com.example.android_mvp;
public interface RequestListener {
/**
* 数据请求成功
*
* @param data 请求到的数据
*/
void onSuccess(String data);
/**
* 使用网络API接口请求方式时,虽然已经请求成功但是由
* 于{@code msg}的原因无法正常返回数据。
*/
void onFailure(String msg);
/**
* 请求数据失败,指在请求网络API接口请求方式时,出现无法联网、
* 缺少权限,内存泄露等原因导致无法连接到请求数据源。
*/
void onError();
/**
* 当请求数据结束时,无论请求结果是成功,失败或是抛出异常都会执行此方法给用户做处理,通常做网络
* 请求时可以在此处隐藏“正在加载”的等待控件
*/
void onComplete();
}
8、MainModel
package com.example.android_mvp;
import android.os.Handler;
public class MainModel {
public static void getData(final String param,final RequestListener callback){
// 利用postDelayed方法模拟网络请求数据的耗时操作
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
switch (param){
case "normal":
callback.onSuccess("根据参数"+param+"的请求网络数据成功");
break;
case "failure":
callback.onFailure("请求失败:参数有误");
break;
case "error":
callback.onError();
break;
}
callback.onComplete();
}
},2000);
}
}