私の主な活動では、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 を取得します。