有關Android生命週期的bug


Posted by Limon on 2021-07-30

在onResume()呼叫API物件

Error:

java.lang.IllegalStateException: calling this from your main thread can lead to deadlock

在寫主畫面時,第一時間必須輸出檔案,又要顯示recyclerView,導致進app時,同一時間onResume()和onCreate()裡的UI部分同時呼叫class可能造成死結,查了一下好像在拿GoogleAuthUtil的token時也很容易出現一樣的問題。

我的解法是將export函數使用new thread執行,剛進app讀取recyclerView時會慢個一秒顯示,但還是算快了。

private void exportSettings() {
        showLoading();
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean apiResponse = KeyAPI.exportSettings(MainActivity.this);
                if (apiResponse == true) {
                    loadConfigs();
                } else {
                    Log.e(LOG_TAG, "Export failed.");
                }
            }
        }).start();
    }

還有在stack overflow看到另一種解法是用AsyncTask,但考慮到exportSetting執行完才能執行下一個步驟,這個方法可能不太適合。

重新打開App會再做一次OnCreate()

後來又遇到生命週期的bug,每次暫時切換到別的App再開回來的時候,app又會做一次onCreate(),很奇怪,明明切別的App時候最後一步驟做的是OnPause(),照理來說必須做onDestroy()之後才會再重新OnCreate()。

查了一些資料之後才知道原來這是原生的bug,當你再次打開app時,手機不會從已開啟的app stack裡呼叫原本打開過的app,他會重新再從onCreate從頭跑一遍。

我的解法是在onCreate()開頭的地方加入判斷,如果已經開過app的話,destroy重新開啟的app,系統就會從已開啟app stack叫原本的app出來。

        if (!isTaskRoot()) {
            Log.d(TAG,"Elaucher is root.");
            finish();
            return;
        }

#Android #lifecycle







Related Posts

F2E合作社|display屬性控制|Bootstrap 5網頁框架開發入門

F2E合作社|display屬性控制|Bootstrap 5網頁框架開發入門

資結、 Complexity and Big O Notation

資結、 Complexity and Big O Notation

create react app 專案 git push 推不上 remote repo

create react app 專案 git push 推不上 remote repo


Comments