【问题标题】:Android: NullPointerException When Instantiating ViewModel in FragmentAndroid:在 Fragment 中实例化 ViewModel 时出现 NullPointerException
【发布时间】:2020-11-16 00:31:49
【问题描述】:

当我尝试将 MyViewModel 实例化为 MyFragment 时出现 NullPointerException:

public class MyFragment extends Fragment {

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        myViewModel = new ViewModelProvider(this, new MyViewModelFactory(
                requireActivity().getApplication(), 0))
                .get(MyViewModel.class);
}

堆栈跟踪似乎指出了最后一行 .get(MyViewModel.class);我现在无法让它工作好几天。我使用 System.out.println() 对 getApplication() 进行了空检查并返回了一个值,所以我认为这不是问题。当我在活动上执行此操作时,我使用的这种方法效果很好,但是当我尝试在 Fragment 上实现它时,发生了 NullPointerException。我应该改变什么来完成这项工作?

以下是我的 ViewModelFactory 课程:

public class MyViewModelFactory implements ViewModelProvider.Factory {

    private Application application;
    private int intValue;

    public MyViewModelFactory(Application paramApplication, int paramIntValue) {
        application = paramApplication;
        intValue = paramIntValue;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass == MyViewModel.class) {
            return (T) new MyViewModel(application, intValue);
        }
        return null;
    }
}

我的 ViewModel 类:

public class MyViewModel extends AndroidViewModel {

    private MyDataModelRepository myDataModelRepository;
    private LiveData<List<MyDataModel>> liveDataListMyDataModel;

    public MyViewModel(@NonNull Application application, int intValue) {
        super(application);
        myDataModelRepository= new myDataModelRepository(application);
        if (intValue> 0) {
            liveDataListMyDataModel= myDataModelRepository.getLiveDataListMyDataModelWhere(intValue);
        } else {
            liveDataListMyDataModel= myDataModelRepository.getLiveDataListMyDataModel();
        }
    }
}

【问题讨论】:

  • Logcat发布错误

标签: java android android-fragments nullpointerexception android-viewmodel


【解决方案1】:

尝试使用它来实例化ViewModel

myViewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);

希望这会有所帮助。随时要求澄清...

【讨论】:

  • 嘿,谢谢!那么我的自定义 MyViewModelFactory 会发生什么?我应该在 getApplication() 参数之后添加一个 int 参数
【解决方案2】:

我刚刚重新调查了我的堆栈跟踪:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'net.mypackage.DataModel.MyDataModel.MyDataModelDao net.mypackage.DataModel.MySystemDatabase.myDataModelDao()' on a null object reference
        at net.mypackage.DataModel.MyDataModel.MyDataModelRepository.<init>(MyDataModelRepository.java:21)
        at net.mypackage.ViewModel.MyViewModel.MyViewModel.<init>(MyViewModel.java:21)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:267) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
        at net.mypackage.View.MyFragment.onViewCreated(MyFragment.java:50)

并认为我的错误很可能来自我的 Repository 或我的 Database room 类,当我重新检查 Database 类时:

public static synchronized MyDatabase getInstance(Context context) {
        if (myDatabase != null) {
            myDatabase = Room.databaseBuilder(context.getApplicationContext(),
                myDatabase.class,
                "my_database")
                .fallbackToDestructiveMigration()
                .addCallback(roomCallback)
                .build();
        }
        return myDatabase;
    }

(myDatabase != null) 是我得到 NPE 的原因,代码中的指令是 myDatabase 在构建数据库之前必须不为空,并且由于此实例在开始时为空,因此它将永远不会被构建,因此是 NPE。

所以我将 (myDatabase != null) 更改为 (myDatabase == null) 并解决了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多