0

私の主な活動では、AlarmManager を開始します。この AlarmManager の Intent は、BroadcastReceiver を拡張したクラスです。さて、この BroadcastReceiver クラスでは、メソッドで AsyncTask を実行しonReceive()ます。このdoInBackground()AsyncTask のメソッドは、Runnable の新しいインスタンスを開始するメソッドを呼び出します。そして、run()この Runnable のメソッドで、いくつかのデータ ポーリングを行い、データを SharedPreference や SQLiteDatabase に保存します。

私の主な活動に戻ると、読み取られて保存されたこれらの値を知りたいと思います。これは、いくつかの値に対してうまく機能します。SharedPreferences や SQLiteDatabase を使用して読み取ります。

1 つの値が変更されると (ポーリング スレッドが 5 分ごとに変更される値を読み取り、正しい値がデータベースに格納されますが、後でメイン アクティビティでそれを読み取ると、古い値を取得するだけであることがわかります。

これが私がすることの例です:

Util というヘルパー クラスがあります。これは次のrun()メソッドから呼び出されます。

Util.storeT1(db, <float value>);

メソッドは次のとおりです。

public static void storeT1(DBAdapter db, float value) {
    db.open();
    long id = 0;
    id = db.insertFloat("T1", value);
    if (id == -1) { // if error
    }
    db.close();     
}

主な活動では、次のことを行います。

float val = Util.getT1(db);

メソッドは次のとおりです。

public static float getT1(DBAdapter db) {
    float i = 0;
    db.open();
    Cursor c = db.get("T1");
    if (c.moveToFirst()) {
        do {
            i = c.getFloat(0);
        } while (c.moveToNext());
    }
    c.close();
    db.close();
    return i;
}

上記のdbは、データベースを処理するクラスである DBAdapter クラスのインスタンスです。関連する方法:

public Cursor get(String column) throws SQLException {
    Cursor mCursor = db.query(DATABASE_TABLE, new String[] { column },
            null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

public long insertFloat(String key, Float value) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(key, value);
    return db.insert(DATABASE_TABLE, null, initialValues);
}

では、Runnable とアクティビティの間でデータを正しく共有するにはどうすればよいでしょうか? 複数のスレッドが原因だと感じていますが、これを修正する方法がわかりません。

編集:

これを行うときは、次のことを言及する必要があります。

float val = Util.getT1(db);

Runnable から保存された値ではなく、値 0.0 を取得します。

4

0 に答える 0