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颗星吧。明年的我,希望可以学习一门语言,然后涨工资!!!加油!!!

单曲循环《牧羊曲》

猜你喜欢

转载自blog.csdn.net/androidzmm/article/details/103764082
今日推荐