2012-08-23 2 views
0

내 앱이 두 개의 각 탭에있는 두 개의 ListView에있는 데이터를 잃게되는 원인을 알아 내려고 노력했습니다. 둘 다 ListFragment입니다. 앱을 최전선에 가져올 때 ListView은 전화에서 무작위로 비어 있습니다.Android Life Cycle - 데이터가 다시로드되지 않음

응용 프로그램을 복원 할 때 데이터를 복원하는 방법이 누락되었다고 생각합니다. 일반적으로 앱 복원 및 두 탭의 데이터가 모두 있습니다.

그러나 실제 휴대 전화에서만 보이는 것처럼 데이터는 ListView에서 사라지지만 재현 가능한 패턴을 찾을 수 없습니다.

많은 조합에서 가비지 수집을 시뮬레이트하기 위해 DDMS를 사용했지만 데이터 손실을 재현 할 수 없습니다. 다음은 내가 라이프 사이클, 간단하고 기본적으로 전체 의사 코드를 다루는 방법입니다.

수명주기 구조를 검토 한 결과 제대로 작동한다고 생각했습니다.

잘못 새로 고침이 되었습니까?

당신은 대구에있는 작은 오타가 있었다

public class MyActivity extends FragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // I don't refresh here 
     // add both tabs to the tab adapter 
    } 

    public void onRestart() { 
     super.onRestart(); 
     reloadTab1(); 
     reloadTab2(); 
    } 
} 

탭 1

public class MyTab1 extends ListFragment { 
    static MyTab1Adapter mAdapter; 
    ArrayList<MyObject> mItems; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain state 
     setRetainInstance(true); 
     reloadTab1(getActivity()); 
    } 

    public void reloadTab1(Context context) { 
     mItems = updateItems(); 

     if (mAdapter == null) { 
      mAdapter = new MyTab1Adapter(context, R.layout.tab1, mItems); 
      setListAdapter(mAdapter); 
     }   
     else { 
      mAdapter.setNewList(mItems); 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

탭 2

public class MyTab2 extends ListFragment { 
    static MyTab2Adapter mAdapter; 
    ArrayList<MyObject> mItems; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain state 
     setRetainInstance(true); 
     reloadTab2(getActivity()); 
    } 

    public void reloadTab2(Context context) { 
     mItems = updateItems(); 

     if (mAdapter == null) { 
      mAdapter = new MyTab2Adapter(context, R.layout.tab2, mItems); 
      setListAdapter(mAdapter); 
     }   
     else { 
      mAdapter.setNewList(mItems); 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 
+1

그냥 오타라고하지만,'onRestart'라고하고'super.onResume()'을 호출합니까? – Luksprog

+0

나는 실제로 그것을 알아 차렸고 내 앱의 버그였습니다. 어쩌면 그것을 고칠 것이고, 우리는 보게 될 것입니다. 잘 잡아 – Kirk

+0

'onRestart'를 사용하고 있다면 백그라운드에서 활동이 종료되지 않으면 그 콜백은 호출되지 않습니다. 'onResume'을 호출 할 때마다 매번 호출되어 다시 액티비티로 돌아올 때마다 프래그먼트가 새로 고쳐 져야합니다. – Luksprog

답변

1

주요 활동 e, onRestart 콜백을 사용했지만 super.onRestart(); 대신 수퍼 클래스에서 onResume mthod를 호출했습니다.

관련 문제