尽管已被销毁,但多次打开子活动仍会导致 InstanceCountViolation

2024-05-13

我正在开发一个具有较低级别活动的项目,称为RecordView显示记录详细信息,例如图像、拍摄日期和时间以及纬度/经度信息。我不是尝试操纵相机进行地理标记并访问 exif 数据,而是尝试实现一个位置侦听器来获取首次拍摄图像的位置(按下按钮时)。这种方法有效 - 我得到了我的位置来正确显示和更新数据库中的记录(稍后返回到视图从头开始显示位置)。但是,如果我退出当前的RecordView然后再输入两个(任意组合)程序将崩溃并出现错误InstanceCountViolation(完整错误重印如下)。当我重写生命周期方法时RecordView当每个被调用时显示,我们发现它在再次被调用之前被销毁。也就是说,似乎不超过一个RecordView在任何给定时间都存在。

所以我的问题归结为:该错误来自哪里以及如何修复它?

是不是有什么东西被毁掉了? LocationListener 是否位于某处并导致问题?是否有一些不相关的东西可能会提供虚假错误?

另外,我是否应该进行可怕的硬编码修复并提高限制RecordView允许实例吗?或者继续寻找另一种方法(例如,我尝试使用PendingIntent.getBroadcast(...) call)?

作为参考,此错误已出现在 3.1 的模拟器和实际平板电脑(Xoom、3.1)上。注释掉监听器更新代码似乎可以避免崩溃(EDIT 2: 我似乎错了)。与侦听器相关的代码如下(可以在公共方法中找到)updateLocation在 - 的里面RecordView class).

    // Listener for the update request
    LocationListener locListener = new LocationListener() {
        // Store the currentRecord so the listener can update it after return
        Record currentRecord = record;
        GeoDatabase database = data;
        @Override
        public void onLocationChanged(Location location) {
            if (location != null) {
                myLocation = location;
                Log.d(TAG, "Location pulled as " + myLocation);
                String lat = Location.convert(myLocation.getLatitude(), 
                        Location.FORMAT_SECONDS);
                String lon = Location.convert(myLocation.getLongitude(), 
                        Location.FORMAT_SECONDS);

                // Update the record values
                currentRecord.setRecordLatitude(lat);
                currentRecord.setRecordLongitude(lon);
                database.updateRecord(currentRecord);
                Log.d(TAG, "Record values now listed as "+ record.getValues());

                // Update the text boxes
                latitude.setText(lat);
                longitude.setText(lon);

                Toast.makeText(getBaseContext(),"GPS location updated",
                        Toast.LENGTH_LONG).show();
            } else {
                Log.w(TAG, "Passed location is null!");
                Toast.makeText(getBaseContext(),
                        "GPS error - unusable location", 
                        Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onProviderDisabled(String provider) {
            Toast.makeText(getBaseContext(),
                    "GPS disabled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderEnabled(String provider) {
            Toast.makeText(getBaseContext(),
                    "GPS enabled", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };

    lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, locListener, null);

完整错误:

android.os.StrictMode$InstanceCountViolation:class [program path].RecordView; instances=3; limit=2
    at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

EDIT:

我已经确定了两件事。

第一个是当Logcat显示销毁时RecordView活动LocationListener已正确断开连接(已损坏?无论如何它都是空的)。然而,听者似乎是从坟墓之外更新的 - 也就是说,我有时会在更高级别的活动屏幕上看到有关 GPS 更新的 Toast 消息,并且 GPS 信息似乎已更新。

第二个是,它并不完全崩溃——它似乎是强制关闭RecordView而不是整个应用程序。该应用程序的主要部分似乎基本上被最小化了。

EDIT 2:

我们最近使用新活动添加了一个首选项屏幕,这具有相同的效果InstanceCountViolation错误为RecordView。我们已经验证,无需更改活动中的任何内容就会发生错误:只需打开几次即可。下面是我们如何从主要活动中打开子活动的示例:

Intent intent = new Intent(this.getActivity()
        .getApplicationContext(), RecordView.class);
Bundle extras = new Bundle();
extras.putString("tableName", "table1");
extras.putInt("id", mId);
extras.putBoolean("newRecord", false);
extras.putLong("folder_id", mFolderId);
extras.putString("type", recordList.get(mId).getTableName());
intent.putExtras(extras);

startActivity(intent); 

所以现在我想知道 Intent 如何处理 Activity 创建和删除是否存在问题。


似乎不需要,但是你尝试过打电话吗

lm.removeUpdates(locListener);

取消注册监听器?

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

尽管已被销毁,但多次打开子活动仍会导致 InstanceCountViolation 的相关文章

随机推荐

  • SQL where 连接集必须包含所有值,但可以包含更多值

    我有三张桌子offers sports和连接表offers sports class Offer lt ActiveRecord Base has and belongs to many sports end class Sport lt
  • 在 WSDL 中包含 XSD

    我正在编写一个 wsdl 文件来在未来 SoapUI 中部署模拟服务 但我在包含我的 xsd 文件时遇到问题 XSD File
  • 将位图旋转 90 度

    我有一个1 个 64 位整数 我需要在 8 x 8 区域中旋转 90 度 最好使用直接位操作 我想不出任何方便的算法 例如 这个 0xD000000000000000 110100000000000000000000000000000000
  • 抑制 Rspec 3 的回溯

    我正在使用 rspec 3 2 0 和 capybara 2 4 4 并在我的 spec helper rb 文件中如下所示 config full backtrace false 对于大多数错误 我都会得到回溯 例如 Failure Er
  • 查找所有子字符串的出现和位置

    我正在编写一个程序来解析一些保存为文本文件的数据 我想做的是找到大海捞针中每根针的位置 我已经可以读取文件并确定出现的次数 但我也希望找到索引 string str sub str is string to search sub is th
  • SQL 查询在多用户环境中返回错误值

    一段时间以来 我们在我们的一个客户站点上发现了奇怪的数据完整性问题 经过大量调查后 我们现在已将其隔离为数据库调用 如果两个用户同时调用同一个存储过程 有时一个用户会得到另一个用户的结果 我们设置了一个测试来验证这一点 并且我们有一个循环
  • 将声音图形化地表示为波

    我创建了一个记录和播放声音的应用程序 我正在寻找一种显示简单波形的方法 记录声音的表示 不需要动画 只需一个简单的图表 如果可以选择波的子集也很好 当然更好 也播放该部分 总而言之 我正在寻找什么 一种以图形方式将录制的声音表示为波的方法
  • 无法更改 MS Access 2007 上的数据类型

    我有一个巨大的数据库 800MB 其中包含一个名为 上次修改日期 的字段 目前该字段作为文本数据类型输入 但需要将其更改为日期 时间字段以执行一些查询 我有另一个完全相同的数据库 但其中只有 35MB 的数据 当我更改数据类型时 它工作正常
  • Google App Engine 数据存储写入:如何远程启用/禁用只读模式?

    在阅读备份时GAE 的数据存储 https developers google com appengine docs adminconsole datastoreadmin where 我们强烈建议您在备份或恢复期间将应用程序设置为只读模式
  • MySQL 过去 12 个月的月度销售情况,包括没有销售的月份

    SELECT DATE FORMAT date b AS month SUM total price as total FROM cart WHERE date lt NOW and date gt Date add Now interva
  • 使用 SYS_CONNECT_BY_PATH 的 Oracle 累积计数

    当我尝试对实际数据执行以下查询时 它返回了更多记录数 请帮助解决这个问题 下面是表 DM TEMP SUMMING DVC BY FW 中的实际数据 device count dmc id firmware version cg id im
  • 在 Eclipse 中的调试会话期间记录所有跟踪信息

    我想记录调试会话的每个步骤的所有调试信息 以便稍后处理所有这些数据 例如调用的方法的名称 参数值 所有变量值等 有没有任何选项可以实现此目的 我应该在哪里更改代码才能实现此目的 一件重要的事情 它不是一个 java 程序 这是一个使用 ac
  • 在并行调用中,限制每秒执行次数

    使用 TPL Parallel ForEach 有一种开箱即用的方法来限制每单位时间调用方法的次数 即每秒不超过 50 次调用 这与限制线程数不同 也许有一些简单的技巧可以使这项工作正常进行 一种解决方案是制作以下线程安全版本https s
  • OOP 中的静态和动态变量/方法是什么?

    我试图更好地理解 OOP 中的基本概念 面向对象编程中的静态和动态变量和方法是什么 例如 使用 this 与使用双冒号 之间有什么区别 this this gt a method 优点 缺点 这个 不是自我记录的 如下所示 this gt
  • 在 iOS 上不显示数字键盘

    根据苹果的文档 http developer apple com library safari documentation AppleApplications Reference SafariHTMLRef Articles InputTy
  • boost::algorithm::join 的一个很好的例子

    我最近想用提升 算法 加入 http www boost org doc libs 1 41 0 doc html string algo reference html header boost algorithm string join
  • 获得 IAP 产品响应后出现 Objective-C 错误

    此代码来自 Phonegap 代码 IAP 插件 错误发生在 发送的js 之后的代码行上 除了最后一个 nil 之外 发送到该函数的所有元素均非零 我什至将它们注销以确保它们已发送 该代码直接来自插件 https github com us
  • 获取 NullPointerException:尝试从字段“int android.view.View.mViewFlags”读取 - Android 动画

    我已经实现了一个动画 其中我在回收器视图中有图像视图 单击该项目时我想在回收器视图之外的图像视图上做一些动画 这样 我创建了一个新的图像视图 将其添加到主容器中 做了动画 最后我将它从主容器中取出 以下是回收器视图的点击项的代码 Code
  • 如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?

    我想编写一个执行以下操作的批处理文件 Check if a service is running 如果正在运行 请退出批处理 如果没有运行 启动该服务 到目前为止 我在谷歌上搜索的代码示例被证明不起作用 所以我决定不发布它们 启动服务是通过
  • 尽管已被销毁,但多次打开子活动仍会导致 InstanceCountViolation

    我正在开发一个具有较低级别活动的项目 称为RecordView显示记录详细信息 例如图像 拍摄日期和时间以及纬度 经度信息 我不是尝试操纵相机进行地理标记并访问 exif 数据 而是尝试实现一个位置侦听器来获取首次拍摄图像的位置 按下按钮时