0

在我的主要活动中,我启动了一个 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 中保存的值。

4

0 回答 0