2013-07-24 2 views
0

저는 최근에 간단한 키 값 맵에 게시하여 일부 데이터 구조를 단순화하려고했습니다. 나는 로그를 push하여 값이 .put 메소드 동안 키와 연관되어 있는지 확인한다.안드로이드 간단한 해시 맵은 값을 유지하지 않습니까?

나중에 .get을 호출하면 값을 더 이상 사용할 수 없습니다. 중요 코드 조각 : 예상대로

MainActivity.class

public final HashMap<String, Integer> resumeMap = new HashMap<String, Integer>(); 

     if (resumeMap.containsKey(url)) { 
       Log.i("Value is there!", url); 
       resumeTime = resumeMap.get(url); 
       Log.i("Value set to:", "" + resumeTime); 
      } else { 
       resumeTime = 0; 
       Log.i("Value is not found!", "" + url); 
      } 

public void setHashmap(String url, Integer time) { 
    resumeMap.put(url, time); 
    int newTime = resumeMap.get(url); 
    Log.i("Setting:", "URL: " + url); 
    Log.i("Setting:", "TIME:" + newTime); 
} 

setHashmap 방법에 VideoPlayer.class

MainActivity setter = new MainActivity(); 
setter.setHashmap(urlString, player.getCurrentPosition()); 

는 로그가 제대로 URL과 시간을 출력한다. 그러나 resumeMap.containsKey (url)는 디버거가 "값을 찾을 수 없습니다!"라는 예상 일치 키를 확인하는 동안에도 false로 유지됩니다. 산출.

MainActivity에서 처음으로 통과하는 동안 결과를 찾을 수 없을 것으로 예상되므로 VideoPlayer 클래스는 resumeTime을 0으로하여 적절한 결과를 얻어 호출됩니다. 키와 값의 설정을 확인합니다. 동일한 링크를 열었을 때 여전히 0을받습니다.

저는 원래 Hashmap을 동일한 클래스로 만들었습니다. 결과는 같았습니다. MainActivity로 맵을 옮겨서 디버깅했습니다. 도움을 주셔서 감사합니다.

+0

이 경우'resumeMap.containsKey' 코드가 배치됩니다 (http://developer.android.com/training/basics/activity-lifecycle/recreating.html 참조) onSaveInstanceStateonRestoreInstanceState를 사용하여 주변의 정보를 전달? 아무데도 거기에 떠있을 수 없습니다 :) 당신의 확실한'url'은 여러분이 기대하는 것을 담고 있습니까? 디버거는 그 가치에 대해 무엇이라고 말합니까? – m0skit0

+0

네, 죄송합니다. 저는 정말로 관련성이있는 부분들을 잡았습니다. resumeMap.containsKey는 shouldOverrideUrlLoading 이벤트에 있습니다. 예, Log.i의 출력 URL ("값을 찾을 수 없습니다!", ""+ url); setter의 url 값과 동일합니다. Log.i ("Setting :", "URL :"+ url); – Chad

+0

첫 번째 패스와 두 번째 패스 사이의 시간은 어떻게됩니까? 액티비티 인스턴스가 파기되어 다시 생성되지 않았습니까? –

답변

2

활동 인스턴스는 화면을 회전 할 때와 같이 항상 파괴되고 다시 생성됩니다 (다른 이유로도). 액티비티는 "여전히 존재"하지만 실제 기본 객체 인스턴스는 파손되어 다시 생성됩니다.

인스턴스 상태 번들 경로를 사용하기 전에 실제로 문제인지 확인하는 빠른 방법은 인스턴스 파괴로 인해 인스턴스가 파괴되지 않도록 HashMap을 정적으로 만드는 것입니다.

때로는 static지도가 괜찮 으면 좋겠지 만, 이와 같은 구조는 모든 곳에서 메모리를 누설 할 수있는 통로를 열어 놓기 때문에주의해야합니다. 더 나은 방법은 지속성의 일종을 사용하는 것입니다, 또는 활동이 사용되는 동안 만 정보를 필요로하는 경우,

관련 문제