架构演进章节——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 星