2017-01-09 61 views
0

我尝试了解实现AsyncTask并将其附加到Fragment后面的基本设计模式。我跟许多教程和执行代码(可提供无): 1)我的片段类,它包含的AsyncTask:附带AsyncTask的Android片段在Activity中提交后为空

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)我的主要活动代码

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); 
    } 
} 

基本上,当运行的代码调试,

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(Activity a)已被弃用,现在我们应该使用onAttached(上下文上下文),这是否意味着它应该被实现为:mCallback = (TaskCallback) context;

回答

0

if(mFM == null)替换为if(mTaskFragment == null)您要检查片段是否为null而不是FragmentManager。

而且对于更新的方法:

public void onAttach(Activity activity)public void onAttach(Context context)

使用:mCallback = (TaskCallback) context;是细如ContextActivty一个超类(只要确保你的活动是实现该接口)

+0

谢谢! 'if(mTaskFragment == null)'解决了这个问题。令人尴尬的是它有多简单,以及我多少努力找到它。 –

+0

没问题,更新的答案包括你的其他问题 –