0

在开发 Android 应用程序时,我遇到了一个非常相关的问题(至少我认为是)。

例子

我们在数据库上插入 10000 行(一次)。

db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
         ContentValues values = new ContentValues();
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}

我们在循环中创建了 10000 个新的 ContentValue 对象。并且对象创建对 VM 来说非常昂贵。如果我们稍微修改一下呢?

不同的方法

ContentValues values, hack = new ContentValues();
db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
         values = hack;
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}

在第二个示例中,我们正在对值对象进行“重置”,因为它将在每一行中使用。

所以,我的问题是:我这样做对吗?使用第二种方法,我正在优化流程而不会留下很大的内存占用?如果不是,为什么?您对此有什么建议/想法吗?

4

1 回答 1

1

你对这两个变量做错了。

考虑以下情况:在第一次迭代中,values = new instance, hack = new instance。好的。在你做之后values = hackvalues现在hack两者都引用相同的内存位置。所以创建两个变量是没有意义的。

您可以简单地执行以下操作:

ContentValues values = new ContentValues();
db.beginTransaction();
try{
    for(Object toInsert: listOfObjects) {
        //put the values on the object
        values.put(key, toInsert.getValue());
        db.insert(columnName, null, values);
    }
    db.setTransactionSuccessful();
} catch(Exception e) {
    //handle exception
} finally {
    db.endTransaction();
}
于 2015-03-16T11:32:38.960 回答