我尝试了解实现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;
?
谢谢! 'if(mTaskFragment == null)'解决了这个问题。令人尴尬的是它有多简单,以及我多少努力找到它。 –
没问题,更新的答案包括你的其他问题 –