2016-07-25 21 views
4

UIとバックグラウンドスレッドhereのやりとりの方法についてお伝えしています。この記事では、ノートは次の通りですAndroid -less 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

ヘッドレスフラグメントは、ビューを持たないフラグメントに過ぎません。フラグメントライフサイクルのonCreate()には、setRetainInstance()true;を使用してください。これにより、アクティビティが再作成されてもフラグメントが破棄されることはありません。 AsyncTaskがフラグメント内で実行されている場合、アクティビティの再作成時にAsyncTaskが失われることはありません。

アクティビティのonCreateでは、タグを付けてフラグメントを追加する必要があります。追加する前に、フラグメントが存在するかどうかをgetFragmentManager().findFragmentByTag(TAG)で確認します。フラグメントがnullの場合は、フラグメントの新しいインスタンスを作成して追加します。 フラグメントではビューが膨張しないため、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(); 
     } 
    } 
} 

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

私は(あなたがしなければならない場合、)だけで確認することで、あなたのUIを更新することにより、私の場合には複雑さを簡素化したよう呼び出し元のフラグメントまたはアクティビティが存在するかどうか。呼び出しエンティティの弱参照を割り当てることによってasynctaskを開始します。

関連する問題