3

私が作成しようとしているアプリは、ViewPagerで構成されていFragmentsます。

から取得したため、それぞれFragmentに異なるデータがありDatabaseます。

Databaseクラスをからに送信Fragment ActivityFragmentますFragmentStatePagerAdapter

コードは次のとおりです。

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return PageFragment.create(position, student, getApplicationContext(), mDbStudent);
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }

}

mDbStudentはデータベースクラスです。

mDbStudentをで開きますonCreate

そして、私はmDbStudentを閉じますonDestroy

私が抱えている問題は、向きが変わったときmDbStudentに破壊されたが、fragmentデータベースからデータをロードしているため、エラーが発生することです。

FragmentいつでmDbStudentを取得しようとしましたが、ページを非常に高速に移動すると、ログにmDbStudentonAttachを閉じなかったことが示されました。

私の質問は、向きが変わったときにmDbStudentを処理する方法はありますか?

4

1 に答える 1

0

アクティビティの外でデータベースをインスタンス化する必要があります。多くの場合、多くのアクティビティとフラグメントでデータベースを使用することになりますよね? 次のように、静的シングルトンを作成できます。

public class Global {
    private static Global instance = null;
    private Context context;

    public Global( Context context ) {
        this.context = context.getApplicationContext();
    }

    public static getInstance( Context context ) {
        if( instance == null )
            instance = new Global( context );
        return instance;
    }

    public SQLiteOpenHelper getDatabase() {
        return ... ;
    }
}

次に、アクティビティで次を呼び出すことができます。

Global.getInstance( this ).getDatabase()...

これにより、アプリケーションのコンテキストが保存されるため、必要に応じてどこでもグローバル インスタンスにアクセスできます...アクティビティがその後破棄された場合でも。

これにより、データベースを一度開くと、向きが変わっても開いたままにすることができます。私のアプリでは、通常、アプリが明示的に閉じられるまで DB を開いたままにします。シングル アクティビティ アプリを使用している場合、データベースが閉じている場合は で開き、 で閉じonStartますonUserLeaveHint()。これは、ユーザーがアプリを離れた場合にのみデータベースを閉じますが、向きが変わった場合には閉じません。

于 2013-03-16T02:04:00.557 に答える