2

ユーザーがウィジェットを有効にしたときに初期化されるSQLiteデータベースオブジェクトを使用するウィジェットアプリケーションを作成しました。メソッドが呼び出されてアプリケーションがクラッシュしたnull直後になる他の場合と同様に、データベースオブジェクトを静的として宣言します。onReceive()

現在mDatabase、メソッドでオブジェクトを使用していますが、onReceive()次を除いてすべてが機能します。

  1. ウィジェットにデータベースの静的メンバーを保持するのは正常ですか、それともより正しい方法がありますか?
  2. アプリケーションをしばらく使用した後 (1 日か 2 日)、アプリケーションがクラッシュし、一部のメンバーが null になったように見えます (mDatabaseおそらく )。

コード例

public class Widget extends AppWidgetProvider {

    private static DatabaseObject mDatabase = null;
    private static int mIndex = 0;

    @Override
    public void onEnabled(Context context) {
        mDatabase = new DatabaseObject (context);
        mDatabase.initialize("Some data"); 
    }

    @Override
    public onReceive(Context context, Intent intent)
    {
        // Some code ....
        mDatabase.getItemAtIndex(mIndex);
        mIndex++;
    }

};
4

1 に答える 1

4

で長期的な操作を行うことは想定されていませんonReceive()。ウィジェットを更新するサービス(IntentService)を開始し、そこでDBの作業を行う必要があります。また、アプリのアクティビティとサービスはいつでも強制終了される可能性があるため、これを処理する必要があることにも注意してください。DBヘルパークラス()にアクセスする必要がある場合はDatabaseObject、それをシングルトンにして、プロセスのライフサイクルの間利用できるようにします。

于 2012-12-18T08:58:52.103 に答える