android - 长时间不活动后在 swapcursor 上获取空指针

标签 android android-fragments android-loadermanager

我的加载器、 fragment 和内容提供器工作正常。我的所有列表都可以正常更新,但是在长时间不活动(主要 Activity 暂停)之后,如果我重新激活该应用程序,我会在 swapsursor 调用上得到一个空指针

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

最佳答案

您的问题很可能在 onActivityCreated 中。

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

关于android - 长时间不活动后在 swapcursor 上获取空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15557376/

相关文章:

java - 删除当前 fragment ,并替换为新 fragment

java - 在父 Activity 中进行权限检查后加载 fragment

Android:使用 Loader 发出 http 请求、更新 SQLite 数据库并填充 GridView fragment

android - ICS 中的 SimpleCursorAdapter

java - AsyncTask - onPostExecute UI 混淆

java - 显示相同内容的 Android Studio 选项卡式 Activity

android - 定义操作栏溢出项

java - 我如何从 Activity 中打开 android.support.v4.app.Fragment

android - 如何在运行时更改 LinearLayout 的圆角颜色?

android - fragment View 异步更新 : ImageView not updating but other childs are getting updated in the view