2013-08-03 3 views
1

progress-bar 단편을 숨긴 다음 progress-bar 단편을 표시하고 새 단편에 데이터를로드 한 다음 표시합니다.AsyncTask, progress 및 fragments

악명 높은 onPostExecute()/configuration-change 문제가 발생했으며 가능한 해결책에 대한 수많은 게시물을 읽은 후 onPostExecute()에서 전환 단편을 다루지 않는 것으로 나타났습니다. 잠재적으로 위험 할 수도 있습니다. 활동이 상태를 저장 한 후에 조각 트랜잭션을 커밋하려고 시도하는 동안 IllegalStateException을 throw합니다. 관련 코드의 조각이다

: 단지 진행 상황을 복잡하게,하지만 난 정말 조각에 충실하고 싶어 보여 단편있는 것은 내가 생각하기 시작 했어

public class MyActivity extends FragmentActivity implements { 

    class LoadListTask extends AsyncTask<Void, Void, MyListItem> { 

     @Override 
     protected void onPreExecute() { 
      showProgressBar(); 
     } 

     @Override 
     protected Response doInBackground(Void... params) { 
      // 
      // ... web call 
      // 
      return new List<MyListItem>; 
     } 

     protected void onPostExecute(List<MyListItem> result) { 
      if (result != null) { 
       hideProgressBar(); 
       showList(result); 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(...); 
     new LoadListTask().execute(session); 
    } 

    public void showProgressBar() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 

     fragmentTransaction.replace(R.id.placeholder, 
       mProgressBarFragment).commit(); 
     fragmentManager.executePendingTransactions(); 
    } 

    private void hideProgressBar() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.remove(mProgressBarFragment) 
       .commit(); 
     fragmentManager.executePendingTransactions(); 
    } 

    private void showList(List<ListItem> list) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 

     Fragment frg = FacebookFriendPickerFragment 
       .newInstance(friendsArrObj); 
     fragmentTransaction.replace(R.id.friendPickerPlaceholder, frg) 
       .commit(); 
     fragmentManager.executePendingTransactions(); 
    } 
} 

을하는 것이 - 그래서 어떤 방법이 조각 생명주기의 합리적인 단계에서 일어날 수 있도록 조각 트랜잭션을 "동기화"하고 AsyncTask/config-change 문제를 피할 수 있습니까?

답변

1

당신은 당신의 조각에이 코드를 삽입 할 필요가 :이 튜토리얼에서 읽을 수 조각으로 구성 변경 처리에 대한

// Retain this fragment across configuration changes. 
setRetainInstance(true); 

더 :

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

희망, 난 당신을 도와줍니다.

+0

감사합니다.이 게시물도 읽었으며 문제가 처음 나타 났을 때 setRetainInstance (true)를 시도했지만 예상대로 조각 자체 만 제어합니다. 문제는 onPostExecute에서 조각을 전환해야한다는 것입니다.(), 파편이 파괴되는 것은 아닙니다. –

+0

당신은 이것을 썼습니다 - "구성 변경 문제 ..."나는 당신이이 게시물을 읽으면 몇 가지 해결책을 찾을 수 있기를 바랐다 ... 미안하지만 나는 다른 생각이 없다. –