加載程序在最近遇到加載程序時遇到問題。我創建了一個小項目,再現問題https://github.com/solcott/loaders-orientation-change啓動新活動後,在新活動中改變方向並按下後退按鈕
我有一個簡單的活動,增加了一個片段
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
}
}
到目前爲止一切正常,我可以改變方向,並且顯示不改變整數。我甚至可以開始新的活動,然後點擊返回按鈕,顯示的整數不會改變。
但是,當我導航到新的活動時,更改方向並按下後退按鈕時,整數會遞增。我希望它的行爲方式與沒有方向改變的方式相同。
在Fragment.onCreate()中調用setRetainInstance(true)使其更糟糕。 onLoadComplete永遠不會被調用,整數也不會顯示。
有沒有其他人遇到這個問題,並找到解決方法?這裏問
你爲什麼使'NEXT_VAL'靜態? – Luksprog 2013-05-13 19:58:16
爲了進行調試,我將其設爲靜態。我在活動中顯示的整數增加,那意味着onCreateLoader被再次調用並遞增。 – solcott 2013-05-13 20:08:26