0

AndroidとJavaで何かを達成する方法の提案が必要です。50 を超えるアクティビティを含む大きなプロジェクトがあり、2 つの異なるデータベース クラスを使用して sqlite ステートメントをクエリし、システムとユーザー データベースから情報を取得しています。データベースの使用方法と初期化方法の例を次に示します。

SystemDatabaseHelper dbHelper = new SystemDatabaseHelper(this, null, 1);
dbHelper.initialize(this);

私はアクティビティでそれを行っており、ここ数日、AndroidのメモリリークとContext、非アクティビティクラスへの提供に関するすべての情報と、これが引き起こす可能性のあるリークについて多くのことを読みました。私の質問は、クラスを作成してメインアクティビティからのみ初期化し、何度も初期化せずに他のすべてのアクティビティで使用する最良の方法はどれかということです。

これを達成するための最良の方法である任意の提案...私はいくつかのアイデアを持っていますが、あなたの提案とベストプラクティスを聞きたいです.

4

2 に答える 2

2

シングルトンを探しているときにデータベースヘルパークラスを一度だけ初期化しようとしている場合はどうなりますか?? ここにあなたがそれを作ることができる例があります

public class ContactDBHelper extends SQLiteOpenHelper {

    private ContactDBHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);

    }

    private static ContactDBHelper mInstance;

    public static synchronized ContactDBHelper getInstance() {

        if (mInstance == null) {
            mInstance = new ContactDBHelper(Util.getApplicationContext(),
                    ContactDB.DB_NAME, null, ContactDB.DB_VERSION);
        }
        return mInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(ContactDB.Contact.CREATE_STMT);
        db.execSQL(ContactDB.Contact.CREATE_PHONE_NUMBER_INDEX);
        db.execSQL(ContactDB.Contact.CREATE_REVERSE_PHONE_NUMBER_INDEX);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

    @Override
    protected Object clone() throws CloneNotSupportedException {

        throw new CloneNotSupportedException();
    }

}

最初に呼び出すとContactDBHelper.getInstance();、インスタンスが初期化されます。その後、任意のアプリケーション コンポーネントまたは任意のメソッドが呼び出すと、初期化されず、初期化されたシングルトン インスタンスが返されます。注: Util.getApplicationContext の場合、メインの Activity に設定されているアプリケーション コンテキストを返す静的ヘルパー メソッドです。

メモリリークの場合、またはを使用してアプリを回避または保護できWeakReferenceますSoftRerference

ここにUtilクラスがあります

public class Util {

    private static WeakReference<Context> applicationContext;

    public static Context getApplicationContext() {
        return applicationContext.get();
    }

    public static void setApplicationContext(Context context) {
        applicationContext = new WeakReference<Context>(context);
    }
}
于 2012-09-29T07:19:11.440 に答える
1

アプリケーション クラスを拡張して、単一のグローバル参照を使用できます。これには、Activity コンテキストを使用しないという利点もあります。

public class NameOfApp extends Application {  

    public static SQLiteDatabase db;

    @Override
    public void onCreate() {

          super.onCreate();

          try{

               // this will create the database if required (e.g. new install or db deleted)
               db=new Database(this.getBaseContext()).getWritableDatabase();        

          } catch (Exception e) {

               // TODO add alert and quit
               Log.e(TAG,"Error creating DB:" + e.getMessage());
               Toast.makeText(getApplicationContext(), "Error creating DB:" + e.getMessage(), Toast.LENGTH_LONG).show();

        }

    } // onCreate

    @Override
    public void onTerminate(){
         Log.d(TAG, "Application.onTerminate() database closed");
         super.onTerminate();
         savePreferences();
         db.close();
    }

    public void closeDB(){
          db.close();
          Log.d(TAG,"Database closed on request");
    }

    protected SQLiteDatabase getwritableDatabase(){
        return db;
    }

}

MyAppName.getWritableDatabase() を使用します。

于 2012-09-29T07:22:46.393 に答える