android app 一个 crash的解决过程!

发布于:2025-06-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

一、日志:
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");
    }