저는 RecordView
라는 하위 수준의 활동이있는 프로젝트에서 이미지, 촬영 날짜 및 시간, 위도 / 경도 등의 기록 세부 정보를 표시하고 있습니다. 정보. 카메라를 조작하여 exif 데이터에 지오 태깅하고 액세스하는 대신 이미지를 처음 찍은 위치를 가져 오는 위치 리스너를 구현하려고합니다 (버튼 누름). 이 접근 방식은 작동합니다-데이터베이스의 레코드를 올바르게 표시하고 업데이트하기 위해 내 위치를 가져옵니다 (나중에보기로 돌아 가면 처음부터 위치가 표시됨). 그러나 현재 RecordView
에서 빠져 나간 다음 두 개 (모든 조합)를 더 입력하면 프로그램이 InstanceCountViolation
오류와 함께 충돌합니다 (전체 오류는 아래에 다시 인쇄 됨). RecordView
의 수명 메서드를 재정 의하여 각 메서드가 호출 될 때 표시되도록하면 다시 호출되기 전에 소멸된다는 것을 알 수 있습니다. 즉, 주어진 시간에 하나 이상의 RecordView
가 존재하는 것 같지 않습니다.
그래서 내 질문은 다음과 같이 요약됩니다. 오류는 어디에서 왔으며 어떻게 해결할 수 있습니까? 그것? 파괴되는 것에 대해 거짓말을하는 것이 있습니까? LocationListener가 어딘가에 앉아 문제를 일으키고 있습니까? 가짜 오류를 제공 할 수있는 관련이없는 것이 있습니까?
또한 끔찍한 하드 코딩 된 수정을 수행하고 허용되는 RecordView
인스턴스의 제한을 초과해야합니까? 아니면 다른 접근 방식을 계속 찾으십시오 (예를 들어 PendingIntent.getBroadcast (...)
호출을 사용하여 단일 업데이트를 요청하려고합니다)?
참고로이 오류는 에뮬레이터에 나타났습니다. 3.1 및 실제 태블릿 (Xoom, 3.1)에서. 리스너 업데이트 코드를 주석 처리하면 충돌을 피하는 것 같습니다 ( EDIT 2 : 내가 그것에 대해 틀린 것 같습니다). 리스너와 관련된 코드는 다음과 같습니다 ( RecordView
클래스 내부의 공개 메서드 updateLocation
에서 찾을 수 있음).
// 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
의 연결이 올바르게 끊어 졌다는 것입니다 (파괴 되었습니까? 어쨌든 null입니다). 그러나 청취자는 무덤 너머에서 업데이트하는 것처럼 보입니다. 즉, 상위 레벨 활동 화면에서 GPS 업데이트에 대한 토스트 메시지를보고 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);
이제 Intent가 활동 생성 및 삭제를 처리하는 방법에 문제가 있는지 궁금합니다.