在我的主要活动中,我启动了一个 AlarmManager。这个AlarmManager 的Intent 是一个扩展BroadcastReceiver 的类。现在,在这个 BroadcastReceiver 类中,我在方法中执行了一个 AsyncTask onReceive()
。此 AsyncTask的doInBackground()
方法调用启动 Runnable 的新实例的方法。在run()
这个 Runnable 的方法中,我做了一些数据轮询并将数据保存到 SharedPreference 和/或 SQLiteDatabase。
回到我的主要活动中,我想知道这些已读取和保存的值。这适用于某些值。我使用 SharedPreferences 和/或 SQLiteDatabase 阅读。
我可以看到,当一个值更改时(轮询线程正在读取每 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 和我的 Activity 之间正确共享数据?我有一种感觉是因为多个线程,但我不知道如何解决这个问题。
编辑:
我应该提到,当我这样做时:
float val = Util.getT1(db);
我得到的值是 0.0,而不是从 Runnable 中保存的值。