2016-07-25 4 views
4

UI와 백그라운드 스레드 간의 상호 작용 방법에 대해 알고 있습니다. here. 이 문서는 노트 다음했다Android-Received headless fragment

:

AsyncTask를 자동으로 구성 변경을 처리하지 않습니다, 즉 활동이 다시됩니다. 프로그래머는 코딩에서 을 처리해야합니다. 이에 대한 일반적인 해결책은 AsyncTask 을 보유 된 헤드리스 프래그먼트로 선언하는 것입니다.

보유 된 헤드리스 조각이 무엇인지 이해하지 못합니다.

예를 들어, 이런 식으로 내가 추가 할 수 있습니다 조각이 같은

FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.add(R.id.frame, new MyFragment()); 
transaction.commit(); 

그리고 조각에 내가 실행할 수 AsyncTask를 :

MyTask myTask = new MyTask(); 
String[] args = {"Hello"}; 
myTask.execute(args); 

는 유지에 AsyncTask를 선언 "이라는인가 머리가없는 단편 "?

답변

4

헤드리스 프래그먼트는보기가없는 조각입니다. 단편 lifeCycle의 onCreate()에는 setRetainInstance()true;을 사용하십시오. 이것은 작업이 다시 생성 되더라도 조각을 파괴하지 않습니다. 따라서 AsyncTask가 액티비티를 다시 만들 때 조각 내에서 실행되면 AsyncTask가 손실되지 않습니다.

활동의 onCreate에는 태그가있는 조각을 추가해야합니다. 추가하기 전에 조각이 null 인 경우 getFragmentManager().findFragmentByTag(TAG)을 사용하여 조각이 있는지 확인한 다음 조각의 새 인스턴스를 만들고 추가하십시오. 조각에는 풍선보기가 없으므로 onCreateView()을 재정의 할 필요가 없습니다.

headlessFragment의 예 :이 같은

public class HeadlessProgressFragment extends Fragment { 

private ProgressListener mProgressListener; 
private AsyncTask<Void, Integer, Void> mProgressTask; 

public interface ProgressListener { 
    void updateProgress(int progress); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

public void setProgressListener(Context context) { 
    mProgressListener = (ProgressListener) context; 
} 

public void startProgress(final int size) { 
    if (mProgressTask == null || mProgressTask.getStatus() != AsyncTask.Status.RUNNING || mProgressTask.getStatus() == AsyncTask.Status.FINISHED) { 
      mProgressTask = new AsyncTask<Void, Integer, Void>() { 
       @Override 
       protected Void doInBackground(Void... params) { 
        for (int index = 0; index < size; index++) { 
         try { 
          Thread.sleep(5000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } finally { 
          publishProgress(index + 1); 
         } 
        } 
        return null; 
       } 

       @Override 
       protected void onProgressUpdate(Integer... values) { 
        super.onProgressUpdate(values); 
        if (mProgressListener != null) { 
         mProgressListener.updateProgress(values[0]); 
        } 
       } 
      }; 
      mProgressTask.execute(); 
     } 
    } 
} 

활동에서 뭔가 :

내가 (당신이있는 경우) 그냥 UI를 업데이트하여 내 경우 복잡성을 단순화으로
public class MainActivity extends FragmentActivity implements HeadlessProgressFragment.ProgressListener { 

private static final String TAG = "progress_fragment"; 
private ProgressBar mProgressBar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.dummy_view); 
    mHeadlessProgressFragment = (HeadlessProgressFragment) getSupportFragmentManager().findFragmentByTag(TAG); 
    if (mHeadlessProgressFragment == null) { 
     mHeadlessProgressFragment = new HeadlessProgressFragment(); 
     getSupportFragmentManager().beginTransaction().add(mHeadlessProgressFragment,TAG).commit(); 
    } 
    mHeadlessProgressFragment.setProgressListener(this); 
    mRectFillingView = (ProgressRectFillingView) findViewById(R.id.progress_bar); 
    final Button startFillBtn = (Button) findViewById(R.id.btn_start_filling); 
    startFillBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mHeadlessProgressFragment.startProgress(100); 
     } 
    }); 
} 

    @Override 
    public void updateProgress(int progress) { 
     mProgressBar.setProgress(progress); 
    } 
} 
0

확인하여 호출하는 프래그먼트 또는 활동이 존재하는지 여부. 호출 엔티티의 weakreference를 지정하여 asynctask를 시작하십시오.