带有附加AsyncTask的Android片段在活动中提交后提供空值

带有附加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);

我试图理解实现AsyncTask并将其附加到片段背后的基本设计模式。我遵循了大量教程和实现的代码(没有给出任何信息): 1) 包含AsyncTask的my Fragment类:

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(活动活动)
is
public 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();
    }