架构演进章节——MVP架构使用,改进后的MVP执行报错

架构演进章节——MVP架构使用,改进后的MVP执行报错


问题描述:

这个是跟着老师敲出的代码,代码一致性我已经验过了,一模一样的。改进之前的mvp架构代码执行是ok的;改进之后执行的结果是mPresenter报空指针。追踪问题,是在BaseActivity类中执行泛型参数反射创建mPresenter实例失败。

尝试过的解决方式:

后来我查跟踪了下,发现这行代码

arguments[0] instanceof BasePresenter

执行的结果是false。然后我又尝试对创建new出了HomePresenter 实例并验证 presenter instanceof BasePresenter 执行结果是true。又追踪了下类,在继承、实现上,以及引用包名上确实是正常的。【我目前怀疑老师演示的mvp伪代码最后的改进是不能执行的】然后就搞不明白为啥?麻烦老师帮忙看下原因,谢谢

相关代码:

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class BaseActivity<P extends BasePresenter> 
        extends AppCompatActivity implements BaseView {
    protected P presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Type superclass = this.getClass().getGenericSuperclass();
        if (superclass instanceof ParameterizedType) {
            // 具备泛型参数类型
            Type[] arguments = ((ParameterizedType)superclass).getActualTypeArguments();
            if (arguments != null && arguments[0] instanceof BasePresenter) {
                try {
                    presenter = (P) arguments[0].getClass().newInstance();
                    presenter.attach(this);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public boolean isAlive() {
        return !isDestroyed() && !isFinishing();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detach();
    }
}


相关代码:

class MainMVPActivity : BaseActivity<HomePresenter>(), HomeContract.View {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_mvp)

        presenter.getUserInfo()
    }

    override fun onGetUserInfoResult(user: User?, errorMsg: String?) {
        // 执行网络请求,后的回调
        // presenter.getUserInfo()
    }


相关代码:

public class HomePresenter extends HomeContract.Presenter{
    @Override
    public void getUserInfo() {
        // presenter 中发起网络请求 -- model层真正执行网络请求
        // 网咯请求成功之后,回调
        if (view.isAlive())
            view.onGetUserInfoResult(new User(), "no  error");
    }
}


public interface HomeContract {
    interface View extends BaseView {
        void onGetUserInfoResult(User user, String errorMsg);
    }



    abstract class Presenter extends BasePresenter<View> {
        public abstract void getUserInfo();
    }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
LovelyChubby 2022-06-19 16:32:12

代码看起来没问题,课程中咱们也是这么用的,这块我记得没有啥改进前,改进后吧?

  • 提问者 学术袁 #1

    这个和咱们课程代码是一样的。我说的改进后是 Presenter层的对象不是new出来。而是通过泛型参数反射得到的。而我经过实践发现以反射方式是没法得到Presenter层对象的。具体原因在上面描述。

    2022-06-19 17:41:28
  • 提问者 学术袁 #2

    我现在正在写一个新的小项目,想尝试一下这个架构。希望老师能看下,谢谢了。

    2022-06-19 17:42:46
  • 提问者 学术袁 #3

    老师  这节课程MVP架构源码(有关于反射得到Presenter层对象的),有存放对应demo吗?我执行一下demo并与我本地代码对比学习一下。

    2022-06-19 18:05:38
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师