2014-02-17 2 views
0

두 가지 (더 많거나 적은) 동적 데이터를로드하는 두 가지 종류의 ArrayAdapter가 내 응용 프로그램에 있습니다. 첫 번째 것은 데이터를 새로 고치기 위해 매 초마다 실행되는 스레드에 바인딩됩니다. 두 번째 것은 onClick 동작으로 데이터를 새로 고칩니다.사용하지 않음 사용하지 않음 새 것을 작성할 때보기

지금 내 응용 프로그램을 실행할 때 dumpsys meminfo에서보기 카운터 이 지속적으로 증가하고 있습니다 (스레드가있는 조각에있는 동안). 분명히 이것은 몇 초/분 후에 엄청난 메모리 누수가 발생합니다. 동일한 이 onClick one에 대해 발생합니다.

내 생각에 이러한 "이전"데이터는 여전히 해당보기 내에 저장되며 은 해제되지 않습니다. 이전보기를 제거 할 수있는 방법이 있습니까? 어댑터가 여기에 있습니다. https://github.com/Blechd0se/android_packages_apps_AeroControl/blob/master/AeroControl/src/com/aero/control/adapter/AeroAdapter.java

어댑터를 사용하는 주요 방법은 다음과 같습니다 (createList()). https://github.com/Blechd0se/android_packages_apps_AeroControl/blob/master/AeroControl/src/com/aero/control/fragments/AeroFragment.java

아니면 불필요한 조회수를 확보 할 수있는 또 다른 방법이 있습니까?

편집 : 아무도 관심이 있다면 해결책을 찾았습니다. 설명과 같이 내가 notifyDataSetChanged() - 메서드는 데이터를 변경할 때마다 사용해야합니다. List를 사용하는 경우에만 가능합니다. 나의 예에서는 을 언급 한 List<adapterInit>이 언급 된 방법과 clear()을 사용하고있다. 또한 매초마다 setAdapter는 입니다. 이제는 데이터 만 변경하고 결과는 예상대로입니다. 시야 수 은 ~ 15.000에서 100-200으로 감소했습니다. 내 github에서 패치를 찾을 수 있습니다.

답변

0

데이터가 변경되었음을 어댑터에 알리지 않고 새 어댑터를 작성하여 데이터를 새로 고치는 것 (아래 코드에서)이 나타납니다. 데이터를 어댑터에 전달한 다음 notifyDataSetChanged();

이렇게하면 매초마다 12 개의 새로운보기를 스팸으로부터 차단할 수 있습니다.

둘째, 어떤 시점에서 가비지 수집기가이를 정리하고 있는지 확인할 수 있습니다. 두 번째로 여러 개의보기를 작성 했으므로 GUI가 합리적으로 유지할 수있는 것보다 빠른 속도로보기를 작성했을 것입니다. 프로그램이 중요한 시점 (확실하지 않음)에 도달하면 프로그램을 일시 중지했을 수 있습니다. 실제 메모리 누수인지 확인하기 위해 메모리 부족으로 인해 실제로 충돌하는지 확인하십시오.

private RefreshThread mRefreshThread = new RefreshThread(); 

    private Handler mRefreshHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      if (msg.what >= 1) { 


       if (isVisible() && mVisible) { 
        createList(); 
        mVisible = true; 
       } else { 
        // Do nothing 
       } 

      } 
     } 
    }; 

public void createList() { 

    // Default Overview Menu 
    adapterInit overview_data[] = new adapterInit[] 
      { 
        // First Value (0) is for loadable images. 
        new adapterInit(getString(R.string.kernel_version), AeroActivity.shell.getKernel()), 
        new adapterInit(getString(R.string.current_governor), AeroActivity.shell.getInfo(GOV_FILE)), 
        new adapterInit(getString(R.string.current_io_governor), AeroActivity.shell.getInfo(GOV_IO_FILE)), 
        new adapterInit(getString(R.string.current_cpu_speed), getFreqPerCore()), 
        new adapterInit(getString(R.string.current_gpu_speed), AeroActivity.shell.toMHz((AeroActivity.shell.getInfo(gpu_file).substring(0, AeroActivity.shell.getInfo(gpu_file).length() - 3)))), 
        new adapterInit(getString(R.string.available_memory), AeroActivity.shell.getMemory(FILENAME_PROC_MEMINFO)) 
      }; 

    listView1 = (ListView) root.findViewById(R.id.listView1); 

    adapter = new AeroAdapter(getActivity(), 
      R.layout.overviewlist_item, overview_data); 

    listView1.setAdapter(adapter); 

} 
+0

같은 것을 추가하더라도; if (adapter! = null) 새 어댑터 else adapter.notifyDataSetChanged() 여전히 작동하지 않습니다. 보기가 계속 성장하고 나는 이유를 모른다. 데이터 구조를 List로 변경하려고 했으므로 clear-Method를 호출 할 수 있지만 끝없는 뷰를 생성합니다. – Blechd0se

+0

최근 수정 사항을 확인하셨습니까? 문제가 해결 되었습니까? 나는 아직도 문제가 있다면 추가 할 수있는 몇 가지 추측을 가지고 있습니다. – NameSpace

+0

예 대부분 해결 된 문제입니다. 고마워요! 유일한 단점; 이제 모든 종류의 onPause() -> onResume()에 새로운 뷰 (listview)가 생성됩니다. 당신은 또한 그것을위한 해결책이있는 경우에 나는 아주 행복할. – Blechd0se