Android 頁面跳轉,前面一個頁面都銷燬了,導致報錯

問題描述:A頁面有個按鈕,選擇圖庫照片裁剪,然後顯示出來,一個簡單的功能,在一個小米9的手機上報錯。裁剪照片一直提示:"保存時發生錯誤,保存失敗"

問題分析:首先這個提示是系統給出的,所以是我們給系統一個錯誤的信息,導致系統給出了這樣的提示。選擇圖片這一步肯定是沒有錯的,因爲這一步我們沒有給系統任何數據,應該裁剪圖片時候出錯了,因爲在這一步,我們需要給一個裁剪的以後應該保存的路徑,裁剪的代碼爲:

crop(data.getData(), getOutCropUri());

    private Uri getOutCropUri() {
      
        Debug.i(TAG, "preCroppedPath:" + preCroppedPath);

        File outFile = new File(preCroppedPath);
        File parentFile = outFile.getParentFile();
        if (parentFile != null) {
            if (!parentFile.exists()) {
                Debug.i(TAG, "getOutCropUri :parent: is not exists");
                parentFile.mkdirs();
            }
        }
        return Uri.fromFile(outFile);
    }

 
private void crop(Uri inUri, Uri outUri) {
        if (inUri == null) {
            return;
        }
        Debug.i(TAG, inUri + "crop" + outUri);
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(inUri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 2);
        intent.putExtra("scale", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri);
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, REQ_CROP);
    }

我把路徑打印出來,路徑是-》:file:///null/dial_bg.png,可以看到路徑中間有個null.爲啥會是null呢,百思不得其解。在其他手機上,也就是正常上的路徑是:file:///storage/emulated/0/Android/data/XXX/files/watch_skin_local/ca8200bd5cf1b1e6f5f70794116adff3/dial_bg.png,標紅的部分,可以看到是因爲成員變量也就是preCroppedPath爲空,這個變量是在oncreate裏面賦值的,我可以明確的是,在去選擇照片之前,這個路徑是不爲空的,爲什麼,在選擇照片回來,這個成員變量爲空。我又仔細看了下日誌,發現不僅是這個成員變量爲空,是所有成員變量,都變成空了,再再看了下,發現A頁面在跳轉到選擇相冊時候整個都銷燬了。媽耶,真的是瘋了,難道app內存泄漏這麼嚴重嘛?導致跳轉頁面時內存不足,導致前一個頁面資源被回收。爲了驗證,於是我新建一個項目,只有兩個頁面,A跳到B.於是發現,即使這種情況下,B頁面新建成功以後,A還是會被onDestory。媽耶,要瘋了,這個手機配置也太低了?這確定是小米9?號稱好看又能打的戰鬥天使???砸了吧,垃圾手機,毀滅吧,不愛了。喝了杯茶,冷靜下來,感覺應該不是手機配置的問題,會不會是開發者選項打開了某個東西,導致每次打開一個新的頁面都會銷燬前面一個界面呢。於是,機智的我,去了開發者選項看了下,咦,這是什麼,“不保留活動”活動=activity?摔!關了!!!於是重新運行一遍,好了。對不起,雷總,我誤會你了,對不起小米9。仔細看了下,每個手機的開發者選項中都有這個選項。

至此問題的原因找到了,關掉這個選項當然可以解決掉,但是,客戶是上帝,你能給你的上帝說,就不準打開這個按鈕嘛。不能呦。所以,我們需要在onSaveInstanceState裏面把需要保存的數據保存起來,然後在oncreate裏面再取出來。


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        preCroppedPath=savedInstanceState==null?null:savedInstanceState.getString("data");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("data",preCroppedPath);
    }

至此問題纔是真真的解決了。

每日語錄:

不知不覺,到年末了。本命年的我,過的也算順風順水。今年準確來說,又雙是碌碌爲爲的一年,房子沒買,工資沒漲,對象沒有,哭遼。最大的突破就是參加毅行的活動,走了10個多小時,走了50km.廢了我的半天老命。也學習了kotlin,功能基本都用kotlin實現。感覺還是很好用的。用起來挺舒服的。但是我還是要說,java是最好的語言。不知道是不是年紀大了的原因,淚點越來越低,話也越來越少,也越來越喜歡獨處,朋友說我已經提前步入老年生活,啊哈哈哈,我覺得這算一種慢生活。我還是很喜歡這種生活的,今年的總結就是這樣,總體來說3顆星吧。明年的我,希望可以學習一門語言,然後漲工資!!!加油!!!

單曲循環《牧羊曲》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章