하위 활동을 여러 번 열면 파괴 되었음에도 불구하고 InstanceCountViolation이 발생합니다.

저는 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가 활동 생성 및 삭제를 처리하는 방법에 문제가 있는지 궁금합니다.

8
задан thegrinner 18 July 2011 в 14:44
поделиться