一、日志:
crash
2024-10-25 12:15:33.020 2113-2113 AndroidRuntime pid-2113 E FATAL EXCEPTION: main
Process: com..workhome, PID: 2113
java.lang.RuntimeException: Unable to start activity ComponentInfo{com..workhome/com.workhome.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.LiveData com.kingtop.workhome.room.AppRepository.getAllApps()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3484)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3648)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2116)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7723)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.LiveData com.workhome.room.AppRepository.getAllApps()' on a null object reference
at com.workhome.MainActivity.setData(MainActivity.java:528)
at com.workhome.MainActivity.onCreate(MainActivity.java:457)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
中文回复,难道mAppRepository 这个为空?
是因为private void initRoom() {
Log.d(TAG, "initRoom: Starting");
new Thread(() -> {
AppDatabase db = AppDatabase.getInstance(this);
AppInfoDao dao = db.appInfoDao();
mAppRepository = new AppRepository(dao);
runOnUiThread(() -> Log.d(TAG, "initRoom: Room database initialized"));
}).start();
Log.d(TAG, "initRoom: Thread started");
}
二、提问:开了一个线程在初始化,就是还没初始化完成,就立马调用mAppRepository导致?
三、解决办法:可以把 setData() 的调用移动到初始化完成的回调中(UI线程)
private void initRoom() {
Log.d(TAG, "initRoom: Starting");
new Thread(() -> {
AppDatabase db = AppDatabase.getInstance(this);
AppInfoDao dao = db.appInfoDao();
mAppRepository = new AppRepository(dao);
// runOnUiThread(() -> Log.d(TAG, "initRoom: Room database initialized"));
runOnUiThread(() -> {
Log.d(TAG, "initRoom: Room database initialized");
setData(); // ← 初始化完成后再调用
});
}).start();
Log.d(TAG, "initRoom: Thread started");
}