架构演进章节——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(); } }
11
收起
正在回答 回答被采纳积分+1
1回答
LovelyChubby
2022-06-19 16:32:12
代码看起来没问题,课程中咱们也是这么用的,这块我记得没有啥改进前,改进后吧?
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星