我正在开发一个具有较低级别活动的项目,称为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 创建和删除是否存在问题。