【问题标题】:Java Android instantiation of many objects许多对象的Java Android实例化
【发布时间】:2015-08-14 13:44:06
【问题描述】:

我的 Android 应用程序有问题。我的问题是我有一个List,我在它上面拉了 40K 的 BDD 行。当我将所有数据放入我的List 时,应用程序变得很慢。有没有优化对象实例化的方法?

private List<ContentValues> addObjects(ResultSet rst) throws DaoException, SQLException {
    //Ajout dans la BDD local SQLlite
    List<ContentValues> values = new ArrayList<>();
    ContentValues value = new ContentValues();
    while (rst.next()) {
        value.put("Numero", rst.getInt("Numéro"));
        value.put("AR_Ref", rst.getString("AR_Ref"));
        value.put.....
        .........;
        values.add(new ContentValues(value));  
    }
    return values;
}

Logcat:GC 工作量很大。

D/dalvikvm&#65109; GC_FOR_ALLOC freed 1230K, 5% free 62021K/64839K, paused 377ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1223K, 5% free 62033K/64839K, paused 367ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1222K, 5% free 62044K/64839K, paused 401ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1220K, 5% free 62056K/64839K, paused 412ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1220K, 5% free 62067K/64839K, paused 418ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1285K, 5% free 62080K/64903K, paused 420ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1293K, 5% free 62092K/64903K, paused 428ms
D/dalvikvm&#65109; GC_FOR_ALLOC freed 1283K, 5% free 62104K/64903K, paused 420ms

【问题讨论】:

  • 你考虑过使用延迟加载或分页吗?
  • 如果我明白你的意思,我会使用 AsyncTask 加载我的数据并将其放在我的 List
  • 为什么要加载40k点?显示它们?
  • @Quentin,不,我更多的是考虑只加载您需要的那部分数据而不加载其他所有内容 - 40k 个对象对于移动设备来说是一个很大的数字 - 你确定你需要一次处理这么多的数据?
  • 我从我的 BDD MS SQL 加载 40K 条目,以使用 SQLLite 将表存储在 Loca 中。

标签: java android object garbage-collection


【解决方案1】:

看起来value 每次循环都会增加。

我认为value 应该在循环开始时实例化(在and 内部),values 应该在循环结束时添加value

private List<ContentValues> addObjects(ResultSet rst) throws DaoException, SQLException {
    List<ContentValues> values = new ArrayList<>();

    while (rst.next()) {
        ContentValues value = new ContentValues();

        value.put("Numero", rst.getInt("Numéro"));
        value.put("AR_Ref", rst.getString("AR_Ref"));
        value.put.....
        .........;

        values.add(value);  
    }

    return values;
}

【讨论】:

  • 我已经尝试过您的解决方案,执行需要 3 分钟,而我的方法需要 2 分钟 11 秒。
  • @Quentin 啊,我误认为ContentValuesList 的一种,但事实并非如此。过一会我会删除我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2020-05-01
  • 2012-07-16
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多