the*_*ner 8 android android-strictmode
我正在开发一个具有较低级别活动的项目,RecordView用于显示记录详细信息,例如图像,拍摄日期和时间以及纬度/经度信息.我试图实现一个位置监听器来获取首次拍摄图像的位置(按下按钮),而不是试图操纵相机进行地理标记和访问exif数据.这种方法有效 - 我得到我的位置以正确显示和更新数据库中的记录(返回视图以后显示从头开始的位置).但是,如果我退出当前RecordView然后再输入两个(任何组合),程序将崩溃并显示错误InstanceCountViolation(下面重新打印完整错误).当我覆盖RecordView每个被调用时显示的生命周期方法时,我们发现它在被再次调用之前被销毁.也就是说,RecordView在任何给定时间似乎不存在多于一个.
所以我的问题归结为:这个错误来自何处以及如何解决?
有什么东西在撒谎?LocationListener是否位于某处并导致问题?是不是可能会提供虚假错误的东西?
此外,我应该做可怕的硬编码修复,只是RecordView允许的实例限制?或者继续寻找另一种方法(作为一个例子,我试图通过PendingIntent.getBroadcast(...)呼叫请求单次更新)?
作为参考,此错误已出现在3.1的仿真器和实际的平板电脑上(Xoom,3.1).注释掉监听器更新代码似乎可以避免崩溃(编辑2:我似乎错了).与侦听器相关的代码如下(可以updateLocation在RecordView类中的公共方法中找到).
// 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);
Run Code Online (Sandbox Code Playgroud)
完整的错误:
android.os.StrictMode$InstanceCountViolation:class [program path].RecordView; instances=3; limit=2
at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经确定了两件事.
第一个是当Logcat显示RecordView活动的破坏时,它LocationListener被正确地断开连接(销毁了吗?无论如何都是null).然而,听众似乎从坟墓之外更新 - 也就是说,我有时会在更高级别的活动屏幕上看到关于GPS更新的Toast消息,并且GPS信息似乎已经更新.
第二个是它并没有完全崩溃 - 它似乎是强制关闭RecordView而不是整个应用程序.该应用程序的主要部分似乎基本上被最小化.
编辑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);
Run Code Online (Sandbox Code Playgroud)
所以现在我想知道Intent是如何处理活动创建和删除的.