在哪种情况下getFragmentManager()返回null?

时间:2014-06-06 13:16:41

标签: android android-fragments

问题:getFragmentManager()随机返回null。

案例:我有一个带标签的活动。在每个选项卡上按我用片段替换内容容器。在两个片段的情况下,我正在进行网络命中以从服务器获取数据。为此,我写了以下代码:

public class FetchMessagesyFragmentTask extends Fragment {
private static final String TAG_EXTRA = "tab_extra";
private static final String TAG = "Test";
private String mData;

public static final FetchMessagesyFragmentTask newInstance(String data) {
    FetchMessagesyFragmentTask fragment = new FetchMessagesyFragmentTask();
    Bundle bundle = new Bundle();
    bundle.putString(TAG_EXTRA, data);
    fragment.setArguments(bundle);
    return fragment;
}

public static interface TaskCallbacks {
    void onPreExecute();
    void onCancelled();
    void onPostExecute(MessageResponse response);
}

private TaskCallbacks mCallbacks;
private FetchMessage mTask;
private boolean mRunning;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    if (!(getTargetFragment() instanceof TaskCallbacks)) {
        throw new IllegalStateException(
                "Target fragment must implement the TaskCallbacks interface.");
    }
    mCallbacks = (TaskCallbacks) getTargetFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    mData = getArguments().getString(TAG_EXTRA);
}

@Override
public void onDestroy() {
    super.onDestroy();
    cancel();
}

public void execute(String data) {
    if (!mRunning) {
        mTask = new FetchMessage();
        mTask.execute(data);
        mRunning = true;
    }
}

public void cancel() {
    if (mRunning) {
        mTask.cancel(false);
        mTask = null;
        mRunning = false;
    }
}


public boolean isRunning() {
    return mRunning;
}

private class FetchMessage extends AsyncTask<String, Void, MessageResponse> {
    private ProgressDialogFragment progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialogFragment.Builder().setMessage(
                "Please wait...").build();
        progressDialog.show(((Fragment) mCallbacks).getFragmentManager(),
                "task_progress");
        mCallbacks.onPreExecute();
        mRunning = true;
    }

    @Override
    protected MessageResponse doInBackground(String... params) {

        //Doing network hit here and returning value.
        return value;
    }

    @Override
    protected void onCancelled() {
        mCallbacks.onCancelled();
        mRunning = false;
    }

    @Override
    protected void onPostExecute(MessageResponse response) {
        if (mCallbacks != null) {
            FragmentManager manager = ((Fragment) mCallbacks)
                    .getFragmentManager();
                //XXXXXXXX GETTING MANAGER AS NULL HERE SOMETIME XXXXXXXXXXXXXX
                progressDialog.dismiss(manager);
                if (response != null) {
                    if (Integer.parseInt(response.getResponseCode()) == NetworkConstant.SUCCESS
                            && response.getChatMessage() != null) {
                        saveDataToDb(response);
                    }
                }
                mCallbacks.onPostExecute(response);

            mRunning = false;
        }
    }

    private void saveDataToDb(MessageResponse response) {
        //SaveToDB
    }
}

}

我正在关注此url来处理网络点击方向更改。我已经评论了我遇到问题的路线。

注意 此代码在正常情况下工作正常但在我快速切换选项卡时崩溃。

0 个答案:

没有答案