2017-01-09 3 views
0

AsyncTaskを実装し、それをFragmentにアタッチした後の基本的なデザインパターンを理解しようとします。私は、多くのチュートリアルと(何も与えない)実装されたコードは、次のとおり AsyncTaskが含まれている1)私の断片クラス:AsyncTaskをアタッチしたAndroidのフラグメントは、アクティビティでコミットした後にnullを返します。

public class MainActivity extends ActionBarActivity implements MyFragment.TaskCallback 
{ 
    private ProgressBar mProgress; 
    private MyFragment mTaskFragment; 
    private final static String TAG_FRAGMENT = "Fragment Task"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mProgress = (ProgressBar) findViewById(R.id.progressBar1); 
     mProgress.setProgress(0); 

     //create fragment manager and fragment instance 
     FragmentManager mFM = getSupportFragmentManager(); 
     mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT); 

     if(mFM == null) 
     { 
      mTaskFragment = new MyFragment(); 
      mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit(); 
     } 
//I added this method, but to no help, the same without this method 
     mFM.executePendingTransactions(); 
    } 


    @Override 
    public void onPreExecute() 
    { 
     mProgress.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onProgressUpdate(Integer... i) 
    { 
     mProgress.setProgress(i[0]); 
    } 

    @Override 
    public void onPostExecute() 
    { 
     mProgress.setVisibility(View.INVISIBLE); 
    } 
} 

基本的に

public class MyFragment extends Fragment 
{ 
    public interface TaskCallback 
    { 
     void onPreExecute(); 
     void onProgressUpdate(Integer... i); 
     void onPostExecute(); 
    } 
    private TaskCallback mCallback; 
    private Task mTask; 

    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 
     mCallback = (TaskCallback) activity; 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 

     mTask = new Task(); 
     mTask.execute(); 
    } 

    private class Task extends AsyncTask<Void, Integer, Void> 
    { 
     @Override 
     protected void onPreExecute() 
     { 
      mCallback.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) 
     { 
      for (int i=0; i<100; i++) 
      { 
       publishProgress(i*10); 
      } 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) 
     { 
      mCallback.onProgressUpdate(values); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      mCallback.onPostExecute(); 
     } 
    } 
} 

2)私の主な活動コード、コードでの実行時デバッグ、

mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT); 
    if(mFM == null) 
    { 
     mTaskFragment = new MyFragment(); 
     mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit(); 
    } 

mTaskFragment = null

を与えた後、

私はここで問題(mTaskFragment = null)、コードはMyFragmentのインスタンスを作成しないと仮定します。
質問:この(Fragment + AsyncTask)パターンを使用してProgressBarをバックグラウンドから更新するコードをどのように変更する必要がありますか?
別の質問:フラグメントonAttached(アクティビティa)は廃止予定です。これでonAttached(コンテキストコンテキスト)を使用する必要があります。つまり、次のように実装する必要がありますか?つまり、mCallback = (TaskCallback) context;

答えて

0

if(mFM == null)if(mTaskFragment == null)に置き換えると、フラグメントがFragmentManagerではなくnullであるかどうかを確認したいと考えます。

またのための更新方法:

public void onAttach(Activity activity)が使用public void onAttach(Context context)

です:mCallback = (TaskCallback) context;ContextActivtyのスーパークラスであるとして罰金です(ちょうどあなたの活動がインタフェースを実装していることを確認してください)

+0

ありがとうございました! 'if(mTaskFragment == null)'は問題を解決します。それがいかに簡単か、どれくらい私がそれを見つけるのに苦労したかは恥ずかしいです。 –

+0

問題はありません。あなたの他の質問を含めるように更新されました –

関連する問題