Android 在长时间不活动后在swapcursor上获取空指针
我的加载程序、片段和内容提供程序工作正常。我的所有列表都可以正常更新,但在长时间不活动(主活动暂停)后,如果我对应用程序进行反应,则会在swapsursor调用上获得空指针Android 在长时间不活动后在swapcursor上获取空指针,android,android-fragments,android-loadermanager,Android,Android Fragments,Android Loadermanager,我的加载程序、片段和内容提供程序工作正常。我的所有列表都可以正常更新,但在长时间不活动(主活动暂停)后,如果我对应用程序进行反应,则会在swapsursor调用上获得空指针 public class ListeFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private ListItemSelectListener listeSelectListener;
public class ListeFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private ListItemSelectListener listeSelectListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listeSelectListener = (ListItemSelectListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " doit implementer ListItemSelectListener");
}
}
// public void onSaveInstanceState (Bundle outState) {
// super.onSaveInstanceState(outState);
// int scroll = this.getSelectedItemPosition();
// outState.putInt("POS", scroll); }
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Log.e ("Resto", "pos="+position+" Rowid= "+id);
listeSelectListener.onItemSelected(position, id);
}
private static final int RESTO_RECENT_LOADER = 0x01;
private static final int RESTO_ALPHA_LOADER = 0x02;
private static final int RESTO_HIGH_LOADER = 0x03;
private static final int RESTO_SEARCH_LOADER = 0x04;
// private static final String AUTHORITY = "ca.usimage.resto.RestoProvider";
// private static final String RESTOS_BASE_PATH = "restos";
private SimpleCursorAdapter adapter;
public void afficheList(int loader_id, String query) {
Log.e ("Resto", "loader_id= "+loader_id);
Bundle mBundle = new Bundle();
mBundle.putString("search_query", query);
getLoaderManager().restartLoader(loader_id, mBundle, this);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
if (savedInstanceState == null) {
String[] uiBindFrom = { RestoDatabase.COL_ETAB, RestoDatabase.COL_MONTANT };
int[] uiBindTo = { R.id.TextView01, R.id.Montant };
// default loader on startup is RECENT_LOADER
LoaderManager lm = getLoaderManager();
if (lm.getLoader(RESTO_RECENT_LOADER) != null) {
lm.initLoader(RESTO_RECENT_LOADER, null, this);
}
// if (adapter == null) {
adapter = new SimpleCursorAdapter(
getActivity().getApplicationContext(), R.layout.row,
null, uiBindFrom, uiBindTo,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
setListAdapter(adapter);
// }
// this.setSelection(savedInstanceState.getInt("POS"));
}
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = { RestoDatabase.ID, RestoDatabase.COL_ETAB, RestoDatabase.COL_MONTANT };
switch (id){
case RESTO_RECENT_LOADER:
return new CursorLoader(getActivity(),
RestoProvider.CONTENT_URI, projection, null, null, "date_infraction DESC");
case RESTO_ALPHA_LOADER:
return new CursorLoader(getActivity(),
RestoProvider.CONTENT_URI_GROUPBY, projection, null, null,"etablissement ASC");
case RESTO_HIGH_LOADER:
return new CursorLoader(getActivity(),
RestoProvider.CONTENT_URI, projection, null, null, "montant DESC");
case RESTO_SEARCH_LOADER:
return new CursorLoader(getActivity(),
RestoProvider.CONTENT_URI, projection, "etablissement like \"%" + args.getString("search_query") + "%\"", null, "etablissement ASC");
default: return null;
}
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
// position cursor at top of list
// this.setSelection(0);
}
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
您的问题最有可能出现在创建的活动中 长时间不活动后,操作系统会破坏您的活动。 当您尝试返回到您的活动时,它将被重新创建。 调用活动的
onCreated
后,调用片段的onActivityCreated
,
但是,只有当savedInstanceState
为空时,才有一个条件创建适配器。
如果它不是空的,您就不会创建适配器
,这会导致以后访问时出现空指针异常。在哪一行出现空指针异常?这是我的第一篇文章,请原谅我没有在代码中添加行号。。。找不到一个简单的方法。。。无论如何,空指针出现在这里:public void onLoadFinished(装入器,游标游标){adapter.swapCursor(游标);不写行号是可以的,但请下次尝试缩进代码。否则几乎无法阅读。我自己缩进代码只是为了弄清楚那里发生了什么。另一个建议是尝试包含尽可能少的代码,以便于人们帮助您。只应包含相关的代码。例如,注释掉的代码行是不相关的。您还应该为您的问题提供更好的标记。如果您这样做,您的问题可能会在几分钟内得到回答,而不是在10天之后。这一点现在非常明显……我甚至忘记了为什么我会提出这样的条件。感谢所有的建议。
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
;
setContentView(R.layout.liste);
final ActionBar ab = getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
if (savedInstanceState != null){
tab_pos = savedInstanceState.getInt("tabState");
ab.addTab(ab.newTab().setText(R.string.tab_recente).setTabListener(this),0,false);
ab.addTab(ab.newTab().setText(R.string.tab_alpha).setTabListener(this),1,false);
ab.addTab(ab.newTab().setText(R.string.tab_fortes).setTabListener(this),2,false);
ab.setSelectedNavigationItem(tab_pos);
} else {
ab.addTab(ab.newTab().setText(R.string.tab_recente).setTabListener(this),0,true);
ab.addTab(ab.newTab().setText(R.string.tab_alpha).setTabListener(this),1,false);
ab.addTab(ab.newTab().setText(R.string.tab_fortes).setTabListener(this),2,false);
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// position cursor at top of list if user retaps a tab
ListeFragment listeFrg = (ListeFragment)getFragmentManager().findFragmentById(R.id.listeFragment);
listeFrg.setSelection(0);
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
ListeFragment listeFrg = (ListeFragment)getFragmentManager().findFragmentById(R.id.listeFragment);
int position = tab.getPosition();
Log.e ("resto", "pos= "+position);
switch (position) {
case 0:
listeFrg.afficheList(RESTO_RECENT_LOADER, null);
break;
case 1:
listeFrg.afficheList(RESTO_ALPHA_LOADER, null);
break;
case 2:
listeFrg.afficheList(RESTO_HIGH_LOADER, null);
break;
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tabState", getActionBar().getSelectedTab().getPosition());
}