Android内存泄漏,没有静态变量

2023-12-02

我是一名初级 Android 开发人员,作为一个实践项目,我正在尝试制作一个可以拍照、将其保存到外部存储并在 ImageView 中显示的活动。几乎一切似乎都正常,但是,我似乎有内存泄漏。

当屏幕方向改变时,我相信活动会被破坏,然后重新创建。为了继续显示图像,我将图像的路径作为字符串存储在 onSaveInstanceState 中的捆绑包中,并在 onResotreInstanceState 中重置图像。拍摄 5mp 照片时,我可以旋转屏幕一次,然后在第二次旋转时,应用程序崩溃,LogCat 报告内存不足错误。对于较低分辨率的图像,我得到了更多的旋转,但应用程序最终仍然崩溃,并且我得到了相同的错误。

我一直在阅读有关 android 内存泄漏的内容,似乎一切都在说不要使用静态 Drawable,它可以引用视图,并阻止虚拟机释放内存。据我所知,我不会做这样的事情来保留参考资料。如果有人可以帮助我找到我的错误,我将非常感激。这是代码:

public class CameraTestsActivity extends Activity {

private Uri fileUri;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

public void takePicture(View view){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputImageFileUri();
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    startActivityForResult(intent, 0);
}

private static Uri getOutputImageFileUri() {
    return Uri.fromFile(getOutputImageFile());
}

private static File getOutputImageFile(){
    Log.d("CameraTestsActivity", "Storage state: " + Environment.getExternalStorageState());
    if (Environment.getExternalStorageState().equals("mounted")){
        File mediaStorageDirs = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures" + "/CameraTestsActivity");
        if (! mediaStorageDirs.exists()){
            if (! mediaStorageDirs.mkdirs()){
                Log.d("CameraTestsActivity", "Failed to create directories");
                mediaStorageDirs = null;
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File imageFile = new File(mediaStorageDirs.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        mediaStorageDirs = null;
        return imageFile;


    }
    Log.d("CameraTestsActivity", "Storage state bad");
    return null;
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK){
        if (requestCode == 0){
            setImage();
        }
    }
    else{
        super.onActivityResult(requestCode, resultCode, data);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    fileUri = Uri.parse(savedInstanceState.getString("uri"));
    setImage();
    super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("uri", fileUri.toString());
    super.onSaveInstanceState(outState);
}

private void setImage(){
    ImageView image = (ImageView)findViewById(R.id.imageView1);
    File file = new File(fileUri.toString().substring(7));
    if (!file.exists())
        Log.d("CameraTestsActivity", "File " + fileUri.toString().substring(7) + "does not exist");
    image.setImageURI(fileUri);
}

}

在显示位图时,我们应该注意它的大小不要超过堆大小或虚拟机预算。 虽然您没有任何内存泄漏,但当您更改方向时,可能需要一些时间来清理以前加载的位图,因此您会收到内存溢出错误。 为了避免此错误,请阅读此内容如何高效显示位图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android内存泄漏,没有静态变量 的相关文章

随机推荐

  • Symfony2 功能测试 $crawler 不工作

    我发现 Symfony2 中的功能测试总是尝试将页面请求为 http localhost 我的环境是使用虚拟主机设置的 因此我的应用程序位于 http symfony dev 经过一些测试我发现如果我运行 var dump client g
  • Javascript 重定向并将参数传递给重定向页面

    我有一个包含两个按钮的主页 每个按钮都应该重定向到同一页面 但是 您重定向到的页面应该根据您按下的按钮执行不同的操作 如何将用户重定向到该新页面并根据您单击的按钮传递参数 使用 JQuery 等工具包 跨浏览器事件处理要简单得多 HTML
  • 将日期分解为数字

    我很抱歉打扰这个问题 但找不到解决方案 我有一个带有列名称日期的 data frame str df date Factor w 360 levels 1982 11 30 1982 12 31 1 4 7 10 13 16 19 22 2
  • 在 PHP 中使用heredoc语法时遇到问题[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心
  • NativeScript 在 Mac 操作系统上找不到 Android SDK

    我已经安装了 NativeScript 并且尝试这样做tns platform add android但它不起作用 ANDROID HOME 路径是正确的 我已经安装了 SDK API 22 和最新的 和工具 25 0 2 当我跑步时tns
  • Magento - 如何在结帐过程中向订单添加发票费用

    如何使用我的付款模块将发票费用添加到订单中 我想这应该在结帐过程中通过我的付款方式模型完成 也许我应该创建一个项目 产品并将其添加到购物车 报价 订单对象中 但我不知道如何做这些事情 请帮忙 尽管有可能 但这并不适合胆怯的人 以下是向总计区
  • 更改 HREF 后 IE 忘记了 A-Tag 的主机名

    我设置了href 的属性 a 在项目中动态标记 在其他时候 我检查 a 的 DOM 属性称为hostname 以确定它是否是内部链接 基本上 这就是发生的情况 a href my first link MyLink a div div JS
  • Android Studio 3.6.1 与 Gradle 插件版本 3.6.1 和 Gradle 版本 5.6.4 无法正常工作

    我的应用程序运行良好 我刚刚更新了安卓工作室3 6 1 更新 Android Studio 后 我收到此对话框 我将更新 Gradle 插件的版本 如下所示 更新后 我的应用程序崩溃并出现以下错误 java lang NoClassDefF
  • .htaccess 重写规则不会使用 unicode 字符

    我正在使用以下 ModRewrite 来使我的网址看起来更干净 RewriteEngine On RewriteRule a zA Z0 9 index php key 1 它允许使用字母和数字就好 但当我尝试使用 时 它会产生 400 错
  • if 和 elseif 有什么区别?

    这应该是一个简单的问题 我有一个简单的 if else 语句 与此有区别吗
  • JavaFX 2 自定义弹出窗格

    JavaFX 2 颜色选择器有一个按钮 可以弹出颜色选择器窗格 如下所示 我想做类似的事情 因为我希望在单击按钮时弹出一个自定义窗格 并在单击其他内容时消失 在我的例子中是一些图像缩略图 实现这一目标的最佳方法是什么 我应该使用 Conte
  • iOS isKindOfClass 和 isMemberOfClass 之间的区别

    两者有什么区别isKind of aClass AnyClass 和isMember of aClass AnyClass 斯威夫特函数 Objective C 中的原始问题 两者有什么区别isKindOfClass Class aClas
  • datepicker 不会触发 onchange 事件

    我有两个输入日期字段 一个通过 JQuery datepicker 生成日期 我希望第二个通过 onblur 或 onchange 事件从第一个输入中获取值 当我手动输入日期时它工作正常 但一旦通过 datepicker 输入 它不会触发第
  • 调试代码时 Ninject 出现无源可用错误

    我已经使用NuGet安装了最新版本的Ninject v2 2 1 4 然后我创建了自己的 NinjectDependencyResolver 归功于亚当 弗里曼和史蒂夫 桑德森 public class NinjectDependencyR
  • 第一次运行flutter时报错:没有找到pubspec.yaml文件

    我试着跟随Get Stated here https flutter io setup windows And got gt flutter run Error No pubspec yaml file found This command
  • Firebase 数据库规范化

    所以我制作了一个简单的应用程序 一个三轮车巡逻应用程序 您可以通过登录并填写表格来举报鲁莽的三轮车司机 在我们的城市这里没有任何问题 报告表格包含 created at description lat lng plateNumber 到目前
  • 用于按行“连接 If”的 VBA 用户定义函数

    我有一些关于是否为特定站点执行特定 服务 例如鸟类调查 的数据 每项服务都有 是 或 否 E G A 列包含站点名称 例如 A B C D 和 E A1 中标题为 站点名称 A2 中标题为 A 依此类推 B 列 B1 中包含 鸟类调查 然后
  • 捕获分段违规并继续生活

    我正在编写一个程序来检查它自己的地址空间 具体来说 我关心所有 malloc 的数据块 如果有一些系统调用来获取它们的列表 那就太棒了 对于我的应用程序 我不能使用 LD PRELOAD wrap 或任何额外的命令行选项 如果有办法做到这一
  • 使 arraylist 上的 select -unique 返回 arraylist 而不是字符串

    我在下面的类中有三个数组列表 我想让它们保持独特 但是 如果数组列表中只有一项 字符串 并且您使用 select unique 或任何其他方法来实现此目的 它将返回字符串而不是字符串列表 用 包围它也不起作用 因为这会将其转换为数组而不是数
  • Android内存泄漏,没有静态变量

    我是一名初级 Android 开发人员 作为一个实践项目 我正在尝试制作一个可以拍照 将其保存到外部存储并在 ImageView 中显示的活动 几乎一切似乎都正常 但是 我似乎有内存泄漏 当屏幕方向改变时 我相信活动会被破坏 然后重新创建