在Runnable和Activity之间共享数据

时间:2013-02-11 09:14:12

标签: android android-sqlite

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

0 个答案:

没有答案