长时间不活动之后在swapcursor上获得空指针

问题描述:

我的加载程序,片段和内容提供程序工作正常。我所有的列表可以更新OK,但不活动的长时间之后(主要活动被暂停),如果我reactivite应用程序,我得到一个空指针上swapsursor呼叫长时间不活动之后在swapcursor上获得空指针

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); 
    } 

好像有与动作条问题因为我试图让一个默认的选择标签在启动时调用一个加载器。

/** 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()); 
    } 
+0

在哪一行会得到空指针异常? – Eran 2013-03-28 03:58:39

+0

这是我有史以来的第一篇文章,所以请原谅我不把行号放在代码中......找不到这样一个简单的方法......无论如何,空指针在这里发生:public void onLoadFinished(Loader loader ,Cursor cursor){0} {0} {0}} adapter.swapCursor(cursor); – Vasavoir 2013-03-31 08:58:21

+0

不要放行数是好的,但请下次尝试缩进您的代码。不然,阅读几乎是不可能的。为了弄清楚发生了什么,我自己缩进了一下。另一个建议是尽量包含尽可能少的代码,让人们更容易帮助你。只有相关的代码应该包括在内。例如,注释掉的代码行不相关。你也应该给你的问题提供更好的标签。如果你这样做了,你的问题可能会在几分钟内得到回答,而不是在10天后。 – Eran 2013-03-31 14:31:01

您的问题很可能在onActivityCreated

长时间不活动后,操作系统会破坏您的活动。 当您尝试返回到您的活动时,它会重新创建。 调用活动的onCreated之后,将调用片段的onActivityCreated, 但您有一个条件,仅当savedInstanceState为空时才会创建adapter。 如果它不为空,则不会创建adapter,这会在稍后访问时导致空指针异常。

+0

现在这很明显......我忘记了为什么我甚至会把这种情况。感谢所有的建议。 – Vasavoir 2013-03-31 22:17:28

+0

不客气! – Eran 2013-03-31 23:19:25