启动新活动后,不会保留装载程序,更改新活动中的方向并按下后退按钮

时间:2013-05-13 19:14:11

标签: android android-loadermanager android-loader

我最近遇到了与装载机有关的问题。我创建了一个小项目来重现问题https://github.com/solcott/loaders-orientation-change

我有一个简单的Activity,它添加了一个片段

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Fragment mainFragment = getFragmentManager().findFragmentById(R.id.main_fragment);
    if(mainFragment == null){
        Log.w(getClass().getSimpleName(), "creating new Fragment");
        mainFragment = new MainFragment();
        getFragmentManager().beginTransaction().add(R.id.main_fragment, mainFragment).commit();
    }
  }
}

在我的片段中,我启动一个Loader,它只返回一个显示在屏幕上的整数。还有一个启动新活动的按钮:

public class MainFragment extends Fragment implements LoaderCallbacks<Integer> {

private static int NEXT_VAL = 0;

TextView text1;

Button button1;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getLoaderManager().initLoader(1, null, this);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_main, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    text1 = (TextView) view.findViewById(android.R.id.text1);
    button1 = (Button) view.findViewById(android.R.id.button1);
    button1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(getActivity(), NextActivity.class));
        }
    });
}

@Override
public Loader<Integer> onCreateLoader(int id, Bundle args) {
    AsyncTaskLoader<Integer> loader = new AsyncTaskLoader<Integer>(
            getActivity()) {

        @Override
        public Integer loadInBackground() {
            return NEXT_VAL++;
        }
    };
    loader.forceLoad();
    return loader;
}

@Override
public void onLoadFinished(Loader<Integer> loader, Integer data) {
    text1.setText(data.toString());
}

@Override
public void onLoaderReset(Loader<Integer> loader) {
    // TODO Auto-generated method stub

}

}

到目前为止一切正常我可以更改方向,显示的整数不会改变。我甚至可以启动新活动,然后点击后退按钮,显示的整数不会改变。

但是,当我导航到新的Activity时,更改方向并按后退按钮会增加整数。我希望它的行为方式与没有方向改变时的行为相同。

在Fragment.onCreate()中调用setRetainInstance(true)会使情况变得更糟。永远不会调用onLoadComplete,根本不会显示整数。

是否有其他人遇到此问题并找到了解决方法?

1 个答案:

答案 0 :(得分:2)

问题如下:Loader unable to retain itself during certain configuration change

对于AsyncTask加载器来说,这是一个令人讨厌的问题。虽然在该主题中提出了一个解决方案,但我认为普遍的共识是避免使用AsyncTaskLoaders。