每日冲刺6
mvp搭建继续
package com.llw.mvplibrary.base; import java.lang.ref.WeakReference; /** * Presenter基类 操作视图View * * @param <V> * @author llw */ public class BasePresenter<V extends BaseView> { //弱引用View protected WeakReference<V> mWeakReference; private V mView; /** * 绑定View * * @param view */ public void attachView(V view) { mView = view; mWeakReference = new WeakReference<V>(view); } /** * 解绑View */ public void detachView() { mView = null; if (mWeakReference != null) { mWeakReference.clear(); mWeakReference = null; } } /** * 获取view * * @return */ public V getView() { if (mWeakReference != null) { return mWeakReference.get(); } return null; } /** * View是否绑定 * * @return */ public boolean isViewAttached() { return mView != null; } }
package com.llw.mvplibrary.base; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import com.llw.mvplibrary.R; import java.util.Objects; /** * 基类Activity,普通Activity继承即可。 * * @author llw */ public abstract class BaseActivity extends AppCompatActivity implements IUiCallback { //Activity 上下文 protected Activity context; //弹窗 private Dialog mDialog; private static final int FAST_CLICK_DELAY_TIME = 500; private static long lastClickTime; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //绑定视图 initBeforeView(savedInstanceState); //获取Activity的上下文 this.context = this; BaseApplication.getActivityManager().addActivity(this); //绑定视图XML if (getLayoutId() > 0) { setContentView(getLayoutId()); } initData(savedInstanceState); } /** * Toast消息提示 字符 * @param llw */ protected void showMsg(CharSequence llw) { Toast.makeText(context, llw, Toast.LENGTH_SHORT).show(); } /** * Toast消息提示 资源ID * @param resourceId */ protected void showMsg(int resourceId){ Toast.makeText(context, resourceId, Toast.LENGTH_SHORT).show(); } /** * 弹窗出现 */ protected void showLoadingDialog() { if (mDialog == null) { mDialog = new Dialog(context, R.style.loading_dialog); } mDialog.setContentView(R.layout.dialog_loading); mDialog.setCancelable(false); Objects.requireNonNull(mDialog.getWindow()).setBackgroundDrawableResource(android.R.color.transparent); mDialog.show(); } /** * 弹窗隐藏 */ protected void hideLoadingDialog() { if (mDialog != null) { mDialog.dismiss(); } mDialog = null; } /** * 返回 不需要参数 */ protected void Back(){ context.finish(); if(!isFastClick()){ context.finish(); } } /** * 返回 toolbar控件点击 * * @param toolbar */ protected void Back(Toolbar toolbar) { toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { context.finish(); if (!isFastClick()) { context.finish(); } } }); } /** * 两次点击间隔不能少于500ms * * @return flag */ protected static boolean isFastClick() { boolean flag = true; long currentClickTime = System.currentTimeMillis(); if ((currentClickTime - lastClickTime) >= FAST_CLICK_DELAY_TIME) { flag = false; } lastClickTime = currentClickTime; return flag; } }
package com.llw.mvplibrary.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.util.AttributeSet; import androidx.annotation.Nullable; import com.llw.mvplibrary.R; import java.lang.ref.SoftReference; /** * 加载框 * @author llw */ public class LoadingView extends androidx.appcompat.widget.AppCompatImageView { private int mCenterRotateX;//图片旋转点x private int mCenterRotateY;//图片旋转点y private LoadingRunnable mRunnable; public LoadingView(Context context) { this(context, null); } public LoadingView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setScaleType(ScaleType.MATRIX); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_loading); setImageBitmap(bitmap); mCenterRotateX = bitmap.getWidth() / 2; mCenterRotateY = bitmap.getHeight() / 2; } /** * onDraw()之前调用 */ @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (mRunnable==null){ mRunnable=new LoadingRunnable(this); } if (!mRunnable.isLoading){ mRunnable.start(); } } /** * view销毁时调用 */ @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mRunnable!=null){ mRunnable.stop(); } mRunnable=null; } class LoadingRunnable implements Runnable { private boolean isLoading; private Matrix mMatrix; private SoftReference<LoadingView> mLoadingViewSoftReference; private float mDegrees = 0f; public LoadingRunnable(LoadingView loadingView) { mLoadingViewSoftReference = new SoftReference<LoadingView>(loadingView); mMatrix = new Matrix(); } @Override public void run() { if (mLoadingViewSoftReference.get().mRunnable != null && mMatrix != null) { mDegrees += 30f; mMatrix.setRotate(mDegrees, mCenterRotateX, mCenterRotateY); mLoadingViewSoftReference.get().setImageMatrix(mMatrix); if (mDegrees==360){ mDegrees=0f; } if (isLoading) { mLoadingViewSoftReference.get().postDelayed(mLoadingViewSoftReference.get().mRunnable, 100); } } } public void stop() { isLoading = false; } public void start() { isLoading = true; if (mLoadingViewSoftReference.get().mRunnable != null && mMatrix != null) { mLoadingViewSoftReference.get().postDelayed(mLoadingViewSoftReference.get().mRunnable, 100); } } } }
package com.llw.mvplibrary.mvp; import android.os.Bundle; import com.llw.mvplibrary.base.BaseActivity; import com.llw.mvplibrary.base.BasePresenter; import com.llw.mvplibrary.base.BaseView; /** * 适用于需要访问网络接口的Activity * * @author llw */ public abstract class MvpActivity<P extends BasePresenter> extends BaseActivity { protected P mPresenter; /** * 创建Presenter */ protected abstract P createPresenter(); @Override public void initBeforeView(Bundle savedInstanceState) { //创建 mPresenter = createPresenter(); //绑定View mPresenter.attachView((BaseView) this); } /** * 页面销毁时解除绑定 */ @Override protected void onDestroy() { super.onDestroy(); mPresenter.detachView(); } }
package com.llw.mvplibrary.mvp; import android.os.Bundle; import com.llw.mvplibrary.base.BaseFragment; import com.llw.mvplibrary.base.BasePresenter; import com.llw.mvplibrary.base.BaseView; /** * 适用于需要访问网络接口的Fragment * * @author llw */ public abstract class MvpFragment<P extends BasePresenter> extends BaseFragment { protected P mPresenter; /** * 创建Presenter */ protected abstract P createPresent(); @Override public void initBeforeView(Bundle savedInstanceState) { mPresenter = createPresent(); mPresenter.attachView((BaseView) this); } @Override public void onDestroy() { super.onDestroy(); mPresenter.detachView(); } }
mvp框架搭建完成
明天进入使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效