Android 中 Mvp 框架 搭建

ActivityManager 类

class ActivityManager {
    private val activityList = LinkedList<Activity>()
    companion object{
        private var instance: ActivityManager? = null
        // 单例模式中获取唯一的MyApplication实例
        fun getInstance(): ActivityManager {
            if (null == instance) {
                instance = ActivityManager()
            }
            return instance as ActivityManager
        }
    }
    // 添加Activity到容器中
    fun addActivity(activity: Activity) {
        activityList.add(activity)
    }
    // 删除Activity到容器中  New Add
    fun removeActivity(activity: Activity) {
        activityList.remove(activity)
        activity.finish()
    }
    fun close() {
        for (activity in activityList) {
            activity.finish()
        }
    }

    // 遍历所有Activity并finish
    fun exit() {
        for (activity in activityList) {
            activity.finish()
        }
        android.os.Process.killProcess(android.os.Process.myPid())
    }
}

BaseActivity 类

@Suppress("DEPRECATED_IDENTITY_EQUALS", "DEPRECATION")
@SuppressLint("MissingPermission", "SourceLockedOrientationActivity")
abstract class BaseActivity : AppCompatActivity(), LifecycleProvider<ActivityEvent> {
    private val lifecycleSubject = BehaviorSubject.create<ActivityEvent>()
    private var myApp: Application? = null
    private var statusH: Int = 0
    private var viewlayout: FrameLayout? = null
    private var tipDialog: QMUITipDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        QMUIStatusBarHelper.translucent(this)
        changeStatusColor(true) //修改状态栏 颜色 默认黑  传参false时 变更为白色
        statusH = QMUIStatusBarHelper.getStatusbarHeight(this)
        setContentView(getContentView())
        myApp = MyApplication.getInstance()
        ActivityManager.getInstance().addActivity(this)
        lifecycleSubject.onNext(ActivityEvent.CREATE)


        initView()
        initData()
        initOnclick()
        initEye()

    }

    protected abstract fun getContentView(): Int

    protected abstract fun initView()

    protected abstract fun initData()
    protected abstract fun initOnclick()


    /**
     * 添加护眼模式浮层
     */
    protected open fun initEye() {
        val content = findViewById<ViewGroup>(android.R.id.content)
        viewlayout = FrameLayout(this)
        viewlayout?.setBackgroundColor(Color.TRANSPARENT)
        val params = WindowManager.LayoutParams()
        params.flags =
            (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
        params.width = WindowManager.LayoutParams.MATCH_PARENT
        params.height = WindowManager.LayoutParams.MATCH_PARENT
        content.addView(viewlayout, params)
    }

    /**
     * 开启护眼模式
     */
    fun openEye() {
        viewlayout?.setBackgroundColor(getFilterColor(30))
    }

    /**
     * 关闭护眼模式
     */
    fun closeEye() {
        viewlayout?.setBackgroundColor(Color.TRANSPARENT)
    }


    /**
     * 过滤蓝光
     * @param [10-30-80]  蓝光过滤比例
     */
    private fun getFilterColor(blueFilterPercent: Int): Int {
        var realFilter = blueFilterPercent
        if (realFilter < 10) {
            realFilter = 10
        } else if (realFilter > 80) {
            realFilter = 80
        }
        val a = (realFilter / 80f * 180).toInt()
        val r = (200 - (realFilter / 80f) * 190).toInt()
        val g = (180 - (realFilter / 80f) * 170).toInt()
        val b = (60 - realFilter / 80f * 60).toInt()
        return Color.argb(a, r, g, b)
    }


    @NonNull
    @CheckResult
    override fun lifecycle(): Observable<ActivityEvent> { //<ActivityEvent>
        return lifecycleSubject.hide()
    }

    @NonNull
    @CheckResult
    override fun <T> bindUntilEvent(@NonNull event: ActivityEvent): LifecycleTransformer<T> {
        return RxLifecycle.bindUntilEvent(lifecycleSubject, event)
    }

    @NonNull
    @CheckResult
    override fun <T> bindToLifecycle(): LifecycleTransformer<T> {
        return RxLifecycleAndroid.bindActivity(lifecycleSubject)
    }

    @CallSuper
    override fun onStart() {
        super.onStart()
        lifecycleSubject.onNext(ActivityEvent.START)
    }

    @CallSuper
    override fun onResume() {
        super.onResume()
        lifecycleSubject.onNext(ActivityEvent.RESUME)
    }

    @CallSuper
    override fun onPause() {
        super.onPause()
        lifecycleSubject.onNext(ActivityEvent.PAUSE)
    }

    @CallSuper
    override fun onStop() {
        super.onStop()
        lifecycleSubject.onNext(ActivityEvent.STOP)
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycleSubject.onNext(ActivityEvent.DESTROY)
        ActivityManager.getInstance().removeActivity(this)
    }


    //修改状态栏颜色
    private fun changeStatusColor(value: Boolean = false) {
        if (value) {
            QMUIStatusBarHelper.setStatusBarLightMode(this) //黑色
        } else {
            QMUIStatusBarHelper.setStatusBarDarkMode(this)   //白色
        }
    }

    fun showProgress() {
        dismissProgress()
        tipDialog = QMUITipDialog.Builder(this).setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
            .setTipWord("加载中...").create()
        tipDialog?.show()
    }

    //自定义文字
    fun showProgress(content: String, type: Int) {
        tipDialog = QMUITipDialog.Builder(this)
            .setIconType(if ((if (type == QMUITipDialog.Builder.ICON_TYPE_LOADING) QMUITipDialog.Builder.ICON_TYPE_LOADING else QMUITipDialog.Builder.ICON_TYPE_NOTHING) == QMUITipDialog.Builder.ICON_TYPE_NOTHING) QMUITipDialog.Builder.ICON_TYPE_SUCCESS else QMUITipDialog.Builder.ICON_TYPE_FAIL)
            .setTipWord(content)
            .create()
        tipDialog?.show()
    }

    fun dismissProgress() {
        if (tipDialog != null) {
            tipDialog?.dismiss()
            tipDialog = null
        }
    }


    fun showConfigDialog(title: String, msg: String, obj: () -> Unit) {
        AlertDialog.Builder(this).setTitle(title).setMessage(msg)
            .setNegativeButton("取消") { dialog, _ -> dialog?.dismiss() }
            .setPositiveButton("确定") { dialog, _ ->
                dialog?.dismiss()
                obj.invoke()
            }
            .create()
            .show()
    }
}

BaseMvpActivity 类

public abstract class BaseMvpActivity<T extends BasePresenter> extends BaseActivity implements BaseView {

    protected T mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    protected void onDestroy() {
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        super.onDestroy();
    }

    /**
     * 绑定生命周期 防止MVP内存泄漏
     *
     * @param <T>
     * @return
     */
    @Override
    public <T> AutoDisposeConverter<T> bindAutoDispose() {
        return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider
                .from(this, Lifecycle.Event.ON_DESTROY));
    }

    @Override
    public void showToast(String str) {
        Toasty.normal(this, str).show();
    }

    @Override
    public void showToastError(Throwable throwable) {
        Toasty.normal(this, ErrorResultUtil.getErrorMessage(throwable)).show();
    }

    @Override
    public void showLoading() {
        showProgress();
    }

    @Override
    public void showLoading(String content) {
        showProgress(content, IconType.ICON_TYPE_LOADING);
    }


    @Override
    public void hideLoading() {
        dismissProgress();
    }

    @Override
    protected void initView() {
    }

    @Override
    protected void initData() {

    }

    @Override
    protected void initOnclick() {

    }

    @Override
    public void endRefreshAndLoadMore() {

    }

}

BaseFragment 类

abstract class BaseFragment : Fragment() {
    private var mContext: AppCompatActivity? = null
    private var mBaseView: View? = null
    private var statusHeight: Int = 0 //状态栏高度
    private var viewlayout: FrameLayout? = null
    protected abstract fun getLayoutId(): Int
    protected abstract fun initViews(savedInstanceState: Bundle)
    protected abstract fun initData()
    protected abstract fun initOnclick()

    //new Add
    override fun onAttach(context: Context) {
        super.onAttach(context)
        this.mContext = context as AppCompatActivity
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        statusHeight = QMUIStatusBarHelper.getStatusbarHeight(mContext)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        if (mBaseView == null) {
            mBaseView = inflater.inflate(getLayoutId(), container, false)
        }
        return mBaseView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (savedInstanceState != null) {
            initViews(savedInstanceState)
        } else {
            initViews(savedInstanceState = Bundle())
        }
        initData()
        initOnclick()
    }

    /**
     * 添加护眼模式浮层
     */
    protected open fun initEye() {
        val content = mContext?.findViewById<ViewGroup>(android.R.id.content)
        viewlayout = FrameLayout(mContext!!)
        viewlayout?.setBackgroundColor(Color.TRANSPARENT)
        val params = WindowManager.LayoutParams()
        params.flags = (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
        params.width = WindowManager.LayoutParams.MATCH_PARENT
        params.height = WindowManager.LayoutParams.MATCH_PARENT
        content?.addView(viewlayout, params)
    }

    /**
     * 开启护眼模式
     */
    fun openEye() {
        viewlayout?.setBackgroundColor(getFilterColor(30))
    }

    /**
     * 关闭护眼模式
     */
    fun closeEye() {
        viewlayout?.setBackgroundColor(Color.TRANSPARENT)
    }

    /**
     * 过滤蓝光
     * @param blueFilterPercent 蓝光过滤比例[10-30-80]
     */
    fun getFilterColor(blueFilterPercent: Int): Int {
        var realFilter = blueFilterPercent
        if (realFilter < 10) {
            realFilter = 10
        } else if (realFilter > 80) {
            realFilter = 80
        }
        val a = (realFilter / 80f * 180).toInt()
        val r = (200 - (realFilter / 80f) * 190).toInt()
        val g = (180 - (realFilter / 80f) * 170).toInt()
        val b = (60 - realFilter / 80f * 60).toInt()
        return Color.argb(a, r, g, b)
    }


    var tipDialog: QMUITipDialog? = null
    fun showProgress(
        iconType: Int = QMUITipDialog.Builder.ICON_TYPE_LOADING,
        tit: String = "正在加载"
    ) {
        tipDialog?.let {
            if (it.isShowing) {
                it.dismiss()
            }
        }
        tipDialog = QMUITipDialog.Builder(activity)
            .setIconType(iconType)
            .setTipWord(tit)
            .create()
        tipDialog?.show()
    }

    fun dismissProgress() {
        tipDialog?.let {
            it.dismiss()
            tipDialog = null
        }
    }


}

BaseMvpFragment类

public abstract class BaseMvpFragment<T extends BasePresenter> extends BaseFragment implements BaseView {

    protected T mPresenter;

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        super.onDestroyView();
    }

    /**
     * 绑定生命周期 防止MVP内存泄漏
     *
     * @param <T>
     * @return
     */
    @Override
    public <T> AutoDisposeConverter<T> bindAutoDispose() {
        return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider
                .from(this, Lifecycle.Event.ON_DESTROY));
    }


    @Override
    public void showToast(String str) {
        Toasty.normal(MyApplication.getInstance(), str).show();
    }

    @Override
    public void showLoading() {
        showProgress(QMUITipDialog.Builder.ICON_TYPE_LOADING, "正在加载");
    }

    @Override
    public void showLoading(String content) {
        showProgress(QMUITipDialog.Builder.ICON_TYPE_LOADING, content);
    }


    @Override
    public void hideLoading() {
        dismissProgress();
    }

    @Override
    public void showToastError(Throwable throwable) {
        Toasty.normal(MyApplication.getInstance(), ErrorResultUtil.getErrorMessage(throwable)).show();
    }

    @Override
    protected void initViews(@NotNull Bundle savedInstanceState) {
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initOnclick() {

    }

    @Override
    public void endRefreshAndLoadMore() {
    }

}

BaseModel 类

 public Apiservice mApiService ;

    public BaseModel(){
        mApiService = ApiManager.getInstance().mApiService;
    }

BasePresenter类

public class BasePresenter<V extends BaseView> {
    protected V mView;

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

    /**
     * 解除绑定view,一般在onDestroy中调用
     */
    public void detachView() {
        this.mView = null;
    }

    /**
     * View是否绑定
     *
     * @return
     */
    public boolean isViewAttached() {
        return mView != null;
    }
}

BaseView 接口

public interface BaseView {

    void showToast(String str);

    //显示加载中
    void showLoading();

    //自定义加载提示内容
    void showLoading(String content);

    //隐藏加载
    void hideLoading();

    //数据获取失败
    void showToastError(Throwable throwable);

    //刷新完成
    void endRefreshAndLoadMore();

    //绑定Android生命周期 防止RxJava内存泄漏
    <T> AutoDisposeConverter<T> bindAutoDispose();
}

ApiManager 类

@SuppressLint("TrustAllX509TrustManager")
public class ApiManager {
    private  List<String> verifyHostNameArray= Collections.singletonList(BaseConfig.BaseApi);//app使用的域名列表

    public Apiservice mApiService = null;
    private static ApiManager INSTANCE = null;

    public static ApiManager getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ApiManager();
        }
        return INSTANCE;
    }

    public static void reset() {
        INSTANCE = new ApiManager();
    }

    private ApiManager() {
        OkHttpClient mOkHttpClient;
        try {
            //信用管理器
            X509TrustManager trustManager = getX509TrustManager();
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{trustManager}, new java.security.SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            mOkHttpClient = new OkHttpClient.Builder()
                    .writeTimeout(BaseConfig.WRITE_TIME, TimeUnit.SECONDS)
                    .readTimeout(BaseConfig.READ_TIME, TimeUnit.SECONDS)
                    .connectTimeout(BaseConfig.CONNECT_TIME, TimeUnit.SECONDS)
                    .addInterceptor(new ApiInterceptor())
                    .sslSocketFactory(sslSocketFactory, trustManager)
                    .hostnameVerifier((hostname, session) -> {
                        //方法1
                        for (String s : verifyHostNameArray) {
                            if (s.contains(hostname)) {
                                return true;
                            }
                        }
                        return false;
                    }).build();
            Retrofit mRetrofit = new Retrofit.Builder()
                    .baseUrl(BaseConfig.BaseApi)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
                    .addConverterFactory(GsonConverterFactory.create())//使用Gson
                    .client(mOkHttpClient)
                    .build();
            this.mApiService = mRetrofit.create(Apiservice.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //信用管理器
    private X509TrustManager getX509TrustManager() throws Exception {

        X509TrustManager x509TrustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];
            }
        };
        return x509TrustManager;
    }
}

ApiInterceptor 类

public class ApiInterceptor implements Interceptor {
    @NotNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();
//
//        HttpUrl.Builder builder = original.url().newBuilder();
//        HttpUrl url = builder.build();

        return chain.proceed(original);
    }


    private static String bodyToString(RequestBody request) {
        try {
            Buffer buffer = new Buffer();
            if (request != null) {
                request.writeTo(buffer);
                return buffer.readUtf8();
            } else {
                return "";
            }
        } catch (IOException var3) {
            return "did not work";
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值