Java LifecycleRegistry未在MVP架构的BaseActivity中初始化
我为我的Activity and Fragment、Presenter、ViewHolder和ViewModel定义了几个基类,并定义了一个接口和Presenter,所有其他活动都继承了这些基类,在我的BaseActivity类和BaseFragmentClass中,我正在创建Java LifecycleRegistry未在MVP架构的BaseActivity中初始化,java,android,androidx,android-lifecycle,android-mvp,Java,Android,Androidx,Android Lifecycle,Android Mvp,我为我的Activity and Fragment、Presenter、ViewHolder和ViewModel定义了几个基类,并定义了一个接口和Presenter,所有其他活动都继承了这些基类,在我的BaseActivity类和BaseFragmentClass中,我正在创建lifecycleRegistry对象并对其进行初始化,但当应用程序启动时,它会崩溃,错误getLifecycle()在ComponentActivity的构造函数中返回null。请确保在第一次调用getLifecycle
lifecycleRegistry
对象并对其进行初始化,但当应用程序启动时,它会崩溃,错误getLifecycle()在ComponentActivity的构造函数中返回null。请确保在第一次调用getLifecycle()时,您是在惰性地构建生命周期,而不是依赖于字段初始化。
文件:BaseFragment.java
package com.example.data.helper.base;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProviders;
public abstract class BaseActivity<V extends MvpView, P extends BasePresenter<V>>
extends AppCompatActivity implements MvpView, View.OnClickListener, LifecycleOwner {
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this) ;
protected P presenter;
private ViewDataBinding viewDataBinding;
private Menu menu;
private int defaultValue = -1;
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
int layoutId = getLayoutId();
if (layoutId > defaultValue) {
try {
viewDataBinding = DataBindingUtil.setContentView(this, layoutId);
} catch (Exception e) {
if (viewDataBinding == null) {
setContentView(layoutId);
}
}
BaseViewModel<V,P> viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
boolean isPresenterCreated = false;
if (viewModel.getPresenter() == null) {
viewModel.setPresenter(initPresenter());
isPresenterCreated = true;
}
presenter = viewModel.getPresenter();
presenter.attachLifecycle(getLifecycle());
presenter.attachView((V) this);
if (isPresenterCreated) {
presenter.onPresenterCreated();
}
}
startUI();
}
@Override
protected void onResume() {
super.onResume();
onResumeUI();
}
protected abstract void onResumeUI();
*/
protected abstract void startUI();
protected abstract void stopUI();
protected ViewDataBinding getViewDataBinding() {
return viewDataBinding;
}
protected static void runCurrentActivity(Context context, Intent intent) {
context.startActivity(intent);
}
@Override
public void onClick(View view) {
}
@Override
protected void onDestroy() {
super.onDestroy();
this.stopUI();
presenter.detachLifecycle(getLifecycle());
presenter.detachView();
}
protected abstract P initPresenter();
protected void setTitle(String title) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(title);
}
}
protected void setClickListener(View... views) {
for (View view : views) {
view.setOnClickListener(this);
}
}
protected BaseFragment<?, ?> mBaseCurrentFragment;
protected void commitFragment(int parentId, BaseFragment<?, ?> baseFragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(parentId, baseFragment, baseFragment.getClass().getName())
.commit();
setCurrentFragment(baseFragment);
}
protected void setCurrentFragment(BaseFragment<?, ?> baseFragment) {
this.mBaseCurrentFragment = baseFragment;
}
protected BaseFragment<?, ?> getBaseCurrentFragment() {
return mBaseCurrentFragment;
}
}
public abstract class BasePresenter<V extends MvpView> implements LifecycleObserver, Presenter<V> {
private V myMvpView;
private Bundle stateBundle;
@Override
public void attachView(V mvpView) {
myMvpView = mvpView;
}
@Override
public void detachView() {
mMvpView = null;
}
@Override
public void attachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void detachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.removeObserver(this);
}
}
public boolean isViewAttached() {
return myMvpView != null;
}
public V getMvpView() {
return myMvpView;
}
public Bundle getStateBundle() {
return stateBundle == null ?
stateBundle = new Bundle() : stateBundle;
}
public void checkViewAttached() {
if (!isViewAttached()) throw new MvpViewNotAttachedException();
}
public static class MvpViewNotAttachedException extends RuntimeException {
public MvpViewNotAttachedException() {
super("Please call Presenter.attachView(MvpView) before" +
" requesting data to the Presenter");
}
}
@Override
public void onPresenterDestroy() {
if (stateBundle != null && !stateBundle.isEmpty()) {
stateBundle.clear();
}
}
}
package com.example.myapp.data.helper.base;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入androidx.annotation.CallSuper;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.databinding.DataBindingUtil;
导入androidx.databinding.ViewDataBinding;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.lifecycle;
导入androidx.lifecycle.LifecycleRegistry;
导入androidx.lifecycle.ViewModelProviders;
公共抽象类BaseFragment
扩展片段实现MvpView、View.OnClickListener{
私有最终生命周期注册生命周期注册=新生命周期注册(此);
受保护的P演示者;
private int defaultValue=-1;
私有视图数据绑定视图数据绑定;
私有视图rootView;
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
@抑制警告(“未选中”)
@超级呼叫
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
BaseViewModel viewModel=ViewModelProviders.of(this.get)(BaseViewModel.class);
布尔值isPresenterCreated=false;
if(viewModel.getPresenter()==null){
setPresenter(initPresenter());
isPresenterCreated=true;
}
presenter=viewModel.getPresenter();
attachLifecycle(getLifecycle());
演示者。附件视图((V)本);
如果(isPresenterCreated)
presenter.onPresenterCreated();
}
@凌驾
ActivityCreated上的公共无效(@Nullable Bundle savedinStateCState){
super.onActivityCreated(savedInstanceState);
startUI();
}
@凌驾
公共void onClick(视图){
}
@非空
@凌驾
公共生命周期注册表getLifecycle(){
回归生命周期登记;
}
受保护的抽象空startUI();
受保护的抽象void stopUI();
受保护的ViewDataBinding getViewDataBinding(){
返回视图数据绑定;
}
@超级呼叫
@凌驾
公共无效onDestroyView(){
super.onDestroyView();
如果(演示者!=null){
detachLifecycle(getLifecycle());
detachView();
}
}
@凌驾
公共空间{
super.ondestory();
如果(演示者!=null){
detachLifecycle(getLifecycle());
detachView();
}
stopUI();
}
私有BaseActivity getBaseActivity(){
返回((BaseActivity)getActivity());
}
私有布尔值isBaseActivityInstance(){
返回BaseActivity的getActivity()实例;
}
受保护的无效集合标题(字符串标题){
if(isBaseActivityInstance()){
getBaseActivity().setTitle(标题);
}
}
受保护的void setClickListener(视图…视图){
用于(视图:视图){
view.setOnClickListener(这个);
}
}
受保护的抽象P initPresenter();
}
文件:BaseActivity.java
package com.example.data.helper.base;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProviders;
public abstract class BaseActivity<V extends MvpView, P extends BasePresenter<V>>
extends AppCompatActivity implements MvpView, View.OnClickListener, LifecycleOwner {
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this) ;
protected P presenter;
private ViewDataBinding viewDataBinding;
private Menu menu;
private int defaultValue = -1;
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
int layoutId = getLayoutId();
if (layoutId > defaultValue) {
try {
viewDataBinding = DataBindingUtil.setContentView(this, layoutId);
} catch (Exception e) {
if (viewDataBinding == null) {
setContentView(layoutId);
}
}
BaseViewModel<V,P> viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
boolean isPresenterCreated = false;
if (viewModel.getPresenter() == null) {
viewModel.setPresenter(initPresenter());
isPresenterCreated = true;
}
presenter = viewModel.getPresenter();
presenter.attachLifecycle(getLifecycle());
presenter.attachView((V) this);
if (isPresenterCreated) {
presenter.onPresenterCreated();
}
}
startUI();
}
@Override
protected void onResume() {
super.onResume();
onResumeUI();
}
protected abstract void onResumeUI();
*/
protected abstract void startUI();
protected abstract void stopUI();
protected ViewDataBinding getViewDataBinding() {
return viewDataBinding;
}
protected static void runCurrentActivity(Context context, Intent intent) {
context.startActivity(intent);
}
@Override
public void onClick(View view) {
}
@Override
protected void onDestroy() {
super.onDestroy();
this.stopUI();
presenter.detachLifecycle(getLifecycle());
presenter.detachView();
}
protected abstract P initPresenter();
protected void setTitle(String title) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(title);
}
}
protected void setClickListener(View... views) {
for (View view : views) {
view.setOnClickListener(this);
}
}
protected BaseFragment<?, ?> mBaseCurrentFragment;
protected void commitFragment(int parentId, BaseFragment<?, ?> baseFragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(parentId, baseFragment, baseFragment.getClass().getName())
.commit();
setCurrentFragment(baseFragment);
}
protected void setCurrentFragment(BaseFragment<?, ?> baseFragment) {
this.mBaseCurrentFragment = baseFragment;
}
protected BaseFragment<?, ?> getBaseCurrentFragment() {
return mBaseCurrentFragment;
}
}
public abstract class BasePresenter<V extends MvpView> implements LifecycleObserver, Presenter<V> {
private V myMvpView;
private Bundle stateBundle;
@Override
public void attachView(V mvpView) {
myMvpView = mvpView;
}
@Override
public void detachView() {
mMvpView = null;
}
@Override
public void attachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void detachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.removeObserver(this);
}
}
public boolean isViewAttached() {
return myMvpView != null;
}
public V getMvpView() {
return myMvpView;
}
public Bundle getStateBundle() {
return stateBundle == null ?
stateBundle = new Bundle() : stateBundle;
}
public void checkViewAttached() {
if (!isViewAttached()) throw new MvpViewNotAttachedException();
}
public static class MvpViewNotAttachedException extends RuntimeException {
public MvpViewNotAttachedException() {
super("Please call Presenter.attachView(MvpView) before" +
" requesting data to the Presenter");
}
}
@Override
public void onPresenterDestroy() {
if (stateBundle != null && !stateBundle.isEmpty()) {
stateBundle.clear();
}
}
}
文件:BasePresenter.java
package com.example.data.helper.base;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ViewModelProviders;
public abstract class BaseActivity<V extends MvpView, P extends BasePresenter<V>>
extends AppCompatActivity implements MvpView, View.OnClickListener, LifecycleOwner {
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this) ;
protected P presenter;
private ViewDataBinding viewDataBinding;
private Menu menu;
private int defaultValue = -1;
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
int layoutId = getLayoutId();
if (layoutId > defaultValue) {
try {
viewDataBinding = DataBindingUtil.setContentView(this, layoutId);
} catch (Exception e) {
if (viewDataBinding == null) {
setContentView(layoutId);
}
}
BaseViewModel<V,P> viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);
boolean isPresenterCreated = false;
if (viewModel.getPresenter() == null) {
viewModel.setPresenter(initPresenter());
isPresenterCreated = true;
}
presenter = viewModel.getPresenter();
presenter.attachLifecycle(getLifecycle());
presenter.attachView((V) this);
if (isPresenterCreated) {
presenter.onPresenterCreated();
}
}
startUI();
}
@Override
protected void onResume() {
super.onResume();
onResumeUI();
}
protected abstract void onResumeUI();
*/
protected abstract void startUI();
protected abstract void stopUI();
protected ViewDataBinding getViewDataBinding() {
return viewDataBinding;
}
protected static void runCurrentActivity(Context context, Intent intent) {
context.startActivity(intent);
}
@Override
public void onClick(View view) {
}
@Override
protected void onDestroy() {
super.onDestroy();
this.stopUI();
presenter.detachLifecycle(getLifecycle());
presenter.detachView();
}
protected abstract P initPresenter();
protected void setTitle(String title) {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setTitle(title);
}
}
protected void setClickListener(View... views) {
for (View view : views) {
view.setOnClickListener(this);
}
}
protected BaseFragment<?, ?> mBaseCurrentFragment;
protected void commitFragment(int parentId, BaseFragment<?, ?> baseFragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(parentId, baseFragment, baseFragment.getClass().getName())
.commit();
setCurrentFragment(baseFragment);
}
protected void setCurrentFragment(BaseFragment<?, ?> baseFragment) {
this.mBaseCurrentFragment = baseFragment;
}
protected BaseFragment<?, ?> getBaseCurrentFragment() {
return mBaseCurrentFragment;
}
}
public abstract class BasePresenter<V extends MvpView> implements LifecycleObserver, Presenter<V> {
private V myMvpView;
private Bundle stateBundle;
@Override
public void attachView(V mvpView) {
myMvpView = mvpView;
}
@Override
public void detachView() {
mMvpView = null;
}
@Override
public void attachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.addObserver(this);
}
}
@Override
public void detachLifecycle(Lifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.removeObserver(this);
}
}
public boolean isViewAttached() {
return myMvpView != null;
}
public V getMvpView() {
return myMvpView;
}
public Bundle getStateBundle() {
return stateBundle == null ?
stateBundle = new Bundle() : stateBundle;
}
public void checkViewAttached() {
if (!isViewAttached()) throw new MvpViewNotAttachedException();
}
public static class MvpViewNotAttachedException extends RuntimeException {
public MvpViewNotAttachedException() {
super("Please call Presenter.attachView(MvpView) before" +
" requesting data to the Presenter");
}
}
@Override
public void onPresenterDestroy() {
if (stateBundle != null && !stateBundle.isEmpty()) {
stateBundle.clear();
}
}
}
公共抽象类BasePresenter实现LifecycleObserver,Presenter{
私人V myMvpView;
私有包stateBundle;
@凌驾
公共无效附件视图(V mvpView){
myMvpView=mvpView;
}
@凌驾
公共视图(){
mMvpView=null;
}
@凌驾
公共无效附件生命周期(生命周期){
如果(生命周期!=null){
添加观察者(本);
}
}
@凌驾
公共生命周期(生命周期){
如果(生命周期!=null){
lifecycle.removeObserver(此);
}
}
公共布尔值isViewAttached(){
返回myMvpView!=null;
}
public V getMvpView(){
返回myMvpView;
}
公共捆绑包getStateBundle(){
返回stateBundle==null?
stateBundle=new Bundle():stateBundle;
}
public void checkViewAttached(){
如果(!isViewAttached())抛出新的MVPViewNotAttacheException();
}
公共静态类MVPViewNotAttacheException扩展了RuntimeException{
公共MVPViewNotAttacheException(){
超级(“请在之前致电Presenter.attachView(MvpView)”+
“向演示者请求数据”);
}
}
@凌驾
在PresenterDestroy()上公开作废{
if(stateBundle!=null&!stateBundle.isEmpty()){
stateBundle.clear();
}
}
}
更新:
我试图通过将lifeCycleRegistry设置为非Final来更新BaseActivity.java和BaseFragment.java的代码,并在getLifecycle中初始化它,如果它为null,那么我只能看到一个空白屏幕,不知道为什么
public abstract class BaseActivity<V extends MvpView, P extends BasePresenter<V>>
extends AppCompatActivity implements MvpView, View.OnClickListener {
private LifecycleRegistry = new LifeCycleRegistry(this);
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
if (lifecycleRegistry==null){
lifecycleRegistry= new LifecycleRegistry(this);
}
return lifecycleRegistry;
}
}
公共抽象类BaseActivity
扩展AppCompatActivity实现MvpView、View.OnClickListener{
private LifecycleRegistry=新生命周期注册(本);