3

여기가 제 설정입니다.앱 재개시 목록 데이터에 상태 저장

나는 메인이 SherlockFragmentActivity입니다. FragmentTransaction 님과 많은 것을 앞뒤로 많은 ListFragments을 교환합니다. 로드를 나타 내기 위해 언제든지 ListFragment 내가 전화 데이터를로드 :

setSupportProgressBarIndeterminateVisibility(true); 

문제 :

주요 Activity처음 시작 또는 사용자 잎 위에 언급 된 다른 애플 리케이션 후 다시 시작 간다 시간 오랜 기간 후에이 일 SherlockFragmentActivity 겉으로 다시로드가의 ActionBar에는 진행 대화 상자가없는, 화면이 몇 초 동안 흰색이며, 다음 목록 데이터 수리 (길이는 데이터 연결에 따라 다름). 여기

몇 가지 추가 코드 :

// Set up Main Screen 
FragmentTransaction t2 = this.getSupportFragmentManager().beginTransaction(); 
SherlockListFragment mainFrag = new FollowingFragment(); 
t2.replace(R.id.main_frag, mainFrag); 
t2.commit(); 

FollowingFragment 항상이 경우에로드 할 하나입니다,이 내가 onCreate()에서 가장 먼저 것들 중 하나 주/기본 Activity 처음로드 될 때 . 여기에는 MySQL 데이터베이스에서 데이터를 가져 오는 ListViewAsyncTask이 포함됩니다.

내 질문 :이 지연을 어떻게 방지합니까? 그리고 사용자가 장기간 떠날 때 데이터를 유지 관리하려면 어떻게해야합니까?

답변

3

이것은 정상적인 동작입니다. 이는 앱이 백그라운드에서 실행될 때 다른 앱의 메모리를 절약하기 위해 활동이 종료 되었기 때문입니다. 포 그라운드로 돌아 오면 시스템이 활동을 다시 작성하여 조각을 다시 만듭니다.

하지만 당신이 정말로 당신의 조각을 다시하지 않도록하려는 경우, 당신은 당신의 조각의에서 onCreate 방법에 setRetainInstance를 사용할 수 있습니다

공공 무효 setRetainInstance (부울 유지)

제어 단편 인스턴스에서 유지되는지 여부 활동 재 작성 (예 : 구성 변경에서). 이것은 백 스택에없는 조각에서만 사용할 수 있습니다. 이 값을 설정하면 작업이 다시 생성 될 때 조각 라이프 사이클이 약간 달라집니다.

onDestroy()는 호출되지 않지만 조각이 현재 활동에서 분리되기 때문에 onDetach()는 여전히 호출됩니다. 조각이 다시 만들어지지 않기 때문에 onCreate (Bundle)가 호출되지 않습니다. onAttach (Activity) 및 onActivityCreated (Bundle)가 계속 호출됩니다.

그리고 당신의 FragmentActivity의 onActivityCreated 방법이 같은 것을 사용 :

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     FragmentManager fm = getFragmentManager(); 

     // Check to see if we have retained the worker fragment. 
     mRetainableFragment = (RetainedFragment)fm.findFragmentByTag("fragmentTag"); 

     // If not retained (or first time running), we need to create it. 
     if (mRetainableFragment == null) { 
      mRetainableFragment = new RetainedFragment(); 
      // Tell it who it is working with. 
      mRetainableFragment.setTargetFragment(this, 0); 
      fm.beginTransaction().add(mRetainableFragment, "fragmentTag").commit(); 
     } 
    } 

그러나 이것은 단지 즉, 헤드리스 조각에 대한 사용 (UI없이 조각이 될 노동자 일명, onCreateView에서 null을 반환해야한다는 인식 파편). 그래도 UI 조각에이 방법을 사용할 수는 있지만 Google에서 권장하지는 않습니다.이 경우 데이터는 작업의 멤버 (필드)로 저장해야합니다. 저장해야하는 데이터가 Bundle 클래스에서 지원되는 경우 onSaveInstanceState() 메서드를 사용하여 데이터를 Bundle에 배치하고 onActivityCreated() 메서드에서 데이터를 검색 할 수 있습니다.

또한 조각이 백 스택에 추가되지 않은 경우에만 작동합니다.

+0

예 '단편'입니다. 그래서'onSaveInstanceState()'메서드를 사용해야 할 것입니다. 어떻게 사용하고 목록 데이터를 저장 하시겠습니까? List는'List '으로 구성됩니다. – KickingLettuce

+0

나는 보통 어디서나 그것을 얻을 수있는 관리자 (싱글 톤)에 나의 데이터를 저장한다. 그래서 UI 인스턴스 상태를 저장할 필요가 없습니다. 그렇지 않으면 직렬화를 구현하기 때문에 목록을 쉽게 저장할 수 있습니다. 객체 클래스도 확인한 다음 저장하려는 번들에 putSerializable 메서드 만 사용하면됩니다. – Gomino

1

Android developer reference page on Activity에 따르면, 당신은 setSupportProgressBarIndeterminateVisibility()를 호출하기 전에 진행 표시 줄 기능을 요청해야 :

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setContentView(R.layout.activity_main); 
setSupportProgressBarIndeterminateVisibility(true); 

, 조각을 다시로드 인해 안드로이드 그들이 다시로드해야 있도록 ListFragment을 살해 다른 문제입니다 수 onSaveInstanceState(Bundle outState)을 무시하고이 데이터를 캐싱하여 해결할 수 귀하의 ListFragment에서 검색 할 수 있습니다 :

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if(savedInstanceState != null) { 
     // retrieve data from Bundle here 
    } else { 
     // no data, we need to reload from network 
    } 

    // initialize your View here 
} 

가이 방법은 보장되지 않는다 그러나 항상 실행해야합니다 (단편 수명주기에 포함되지 않음). 따라서 데이터를 onPause()에 캐시하고 항상 네트워크 연결에서로드하는 대신 사용하십시오.

@Override 
public void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = getActivity().getSharedPreferences(); 
    SharedPreferences.Editor editor = prefs.edit(); 
    // put your data here using editor 
    editor.commit(); 
} 

그럼 당신은 SharedPreferences의 인스턴스를 검색하고 prefs.getString(String key) 및 다른 방법을 사용하여 onCreateView()이 데이터를로드 할 수 있습니다.

0

기간 연장 후 활동으로 돌아 오면 전체 앱이 다시 시작됩니다. 따라서 데이터를 저장하기 위해 객체 변수를 사용할 수 없습니다.

그래서 당신은 activity onStop() 메소드의 일부 로컬 스토리지에 데이터를 저장하는 것으로 언급했습니다. 예를 들어, 공유 환경 설정.

그리고 onCreate()를 호출 할 때 데이터가 저장되어 있는지 확인하고 다음 번에 정리를 시작하기 위해 정리하십시오. 그렇지 않으면 asynctask를 시작하십시오.

1

앱이 종료되면 활동 상태와 데이터가 손실됩니다. 귀하의 AsyncTask에 대해 다음과 같은 두 가지 시나리오가 있습니다 :
1. Webserver에서 일부 데이터를 가져옵니다. 이 경우 개인적으로 webserver에서 가져온 데이터를 캐싱하는 것이 serializable을 구현하는 것보다 나은 해결책이라고 생각합니다.
2. 로컬 데이터베이스에서 많은 양의 데이터를 가져오고 있습니다. 이로 인해 데이터 검색에 시간이 걸립니다. 이 시나리오에서는 필요한만큼의 데이터 만 가져 오는 것이 좋습니다. (예를 들어, 20 개의 항목을 검색 할 수 있으며, 사용자가 ListView 끝으로 스크롤하면 다음 20 개 항목을 검색합니다). 이 솔루션을 사용하면 응용 프로그램이 데이터를 더 빨리 검색 할 수 있습니다.

추신 : 어떻게 당신의 AsyncTask에 위치한 가정 캐시 기능, 함께 WebserviceModule을 구현하는 당신에게 단서를 제공하는 당신은 SDCard에있는 webserver에서 모든 응답하고 webserver에서 일부 리소스를 검색하려는 모든 시간을 절약 할 수 있습니다 , SDCard를 확인하여 요청이 이미 보내지고 캐시되어 있는지 확인해야합니다!모든 요청에 ​​대해 캐시 된 파일을 인식하려면 urlpost parameters에 고유 한 서명 기반을 만들어야합니다.