在我的主要活动中,我启动了一个AlarmManager。此AlarmManager的Intent是一个扩展BroadcastReceiver的类。现在,在这个BroadcastReceiver类中,我在onReceive()
方法中执行AsyncTask。此AsyncTask的doInBackground()
方法调用一个方法来启动Runnable的新实例。在此Runnable的run()
方法中,我进行了一些数据轮询并将数据保存到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中保存的值。