带有附加AsyncTask的Android片段在活动中提交后提供空值
我试图理解实现AsyncTask并将其附加到片段背后的基本设计模式。我遵循了大量教程和实现的代码(没有给出任何信息): 1) 包含AsyncTask的my Fragment类:带有附加AsyncTask的Android片段在活动中提交后提供空值,android,android-fragments,android-asynctask,Android,Android Fragments,Android Asynctask,我试图理解实现AsyncTask并将其附加到片段背后的基本设计模式。我遵循了大量教程和实现的代码(没有给出任何信息): 1) 包含AsyncTask的my Fragment类: public class MyFragment extends Fragment { public interface TaskCallback { void onPreExecute(); void onProgressUpdate(Integer... i);
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();
}
}
}
基本上,当通过调试运行代码时
mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT);
if(mFM == null)
{
mTaskFragment = new MyFragment();
mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit();
}
给出mTaskFragment=null
我想这就是问题所在(mTaskFragment=null),代码没有创建MyFragment的实例。
问题是:我应该如何使用此(片段+异步任务)模式更改代码以从后台更新ProgressBar?
另一个问题:片段onAttached(活动a)已被弃用,现在我们应该使用onAttached(上下文上下文上下文),这是否意味着它应该像这样实现:
mCallback=(TaskCallback)上下文
?用if(mFM==null)
替换if(mTaskFragment==null)
要检查片段是否为null而不是FragmentManager
此外,更新的方法适用于:
public void-onAttach(活动活动)
ispublic void-onAttach(上下文)
使用:
mCallback=(TaskCallback)上下文
很好,因为上下文
是Activity
的一个超类(请确保您的活动正在实现接口)谢谢<代码>如果(mTaskFragment==null)解决了该问题。令人尴尬的是,它是多么简单,我是多么努力地找到它。没问题,更新的答案包括了你的其他问题
mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT);
if(mFM == null)
{
mTaskFragment = new MyFragment();
mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit();
}