2017-01-09 1 views
0

AsyncTask를 구현하고 Fragment에 연결하는 기본 디자인 패턴을 이해하려고합니다. 나는 많은 자습서 및 (아무것도 제공하지 않습니다) 구현 코드를 따르 AsyncTask를 들어 있습니다 1) 내 조각 클래스 :AsyncTask가 첨부 된 Android Fragment가 액티비티의 커밋 후 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

,691를 제공

여기에 문제가 있다고 가정합니다 (mTaskFragment = null). 코드가 MyFragment의 인스턴스를 만들지 않습니다.
질문 :이 (조각 + AsyncTask) 패턴을 사용하여 백그라운드에서 ProgressBar를 업데이트하는 코드를 어떻게 변경해야합니까?
다른 질문 : onAttached (Activity a) 단편이 사용되지 않으므로 이제는 onAttached (Context context)를 사용해야합니다. 즉, 다음과 같이 구현되어야합니다 : mCallback = (TaskCallback) context;?

답변

0

if(mFM == null)if(mTaskFragment == null)으로 바꾸려면 조각이 FragmentManager가 아닌지 확인하고 싶습니다.

또한 대한 업데이트 방법 :

public void onAttach(Activity activity)

사용 public void onAttach(Context context)

입니다 : mCallback = (TaskCallback) context;ContextActivty의 슈퍼 클래스이기 때문에

+0

감사합니다 (당신의 활동이 인터페이스를 구현되어 있는지 확인) 괜찮습니다! 'if (mTaskFragment == null)'는 문제를 해결합니다. 그것이 얼마나 간단한 지 당황스럽고 그것을 찾기 위해 얼마나 많은 어려움을 겪었습니다. –

+0

다른 질문을 포함하도록 문제가 없으며 업데이트되었습니다. –

관련 문제