【问题标题】:Will there be any difference in performance if I iterate JsonArray instead of Arraylist inside onBindViewHolder?如果我在 onBindViewHolder 中迭代 JsonArray 而不是 Arraylist,性能会有什么不同吗?
【发布时间】:2019-08-18 20:46:51
【问题描述】:

方法A(常规方法):

  1. 我们从 API 获取 JsonArray
  2. 迭代 JsonArray(在 for 循环内)并将 JsonArray 中的值传递给模型类的对象(Getter 和 Setter),并将模型类的对象添加到 ArrayList
  3. 将该 ArrayList 传递给 recyclerAdapter
  4. 在 recyclerAdapter 的 onBindViewHolder 方法中迭代 ArrayList
  5. 并在 onBindViewHolder 方法中为 textView、imageView 等设置值

方法B:

  1. 我们从 API 获取 JsonArray
  2. 将整个 JsonArray 传递给 recyclerAdapter
  3. 在 onBindViewHolder 中迭代 jsonArray(不使用 ArrayList)并将值直接设置为 textViews、imageViews 等,如下所示

    @Override
    public void onBindViewHolder(Holder holder, int i) {
    
        try {
        holder.textView.setText(jsonArray.getJSONObject(i).getString("textKey"));
        } catch (JSONException e) {
        e.printStackTrace();
        }
    }
    

请问,由于我们没有使用模型类和 ArrayList,所以我使用第二种方法时会有任何性能改进。

性能会下降还是保持不变。

我不关心可读性,我唯一关心的是性能。

注意:- using try catch multiple times has no effect on performance 所以我们可以忽略它。

【问题讨论】:

  • 真正了解的唯一方法是进行基准测试。然后你就会知道它在你的特定条件下是如何工作的。

标签: java android


【解决方案1】:

请问,当我使用第二个时,性能会有所改善吗 方法,因为我们没有使用模型类和 ArrayList。

性能会下降还是保持不变。

我不关心可读性,我唯一关心的是性能。

使用方法 B 会降低性能,因为每当您调用以下命令时都会有额外的调用:

holder.textView.setText(jsonArray.getJSONObject(i).getString("textKey"));

如果你把上面的线分解,它会是这样的:

  • holder.textView.setText()
  • jsonArray.getJSONObject(i)
  • JSONObject.getString("textKey")

您应该注意JSONObject.getString("textKey") 需要做一些繁重的工作才能通过调用以下getString method code 来找到键textKey 的值:

public String getString(String name) throws JSONException {
    Object object = get(name);
    String result = JSON.toString(object);
    if (result == null) {
        throw JSON.typeMismatch(name, object, "String");
    }
    return result;
}

你可以看到 JSON 对象还有另一个额外的方法调用 JSON.toString(object):

static String toString(Object value) {
    if (value instanceof String) {
        return (String) value;
    } else if (value != null) {
        return String.valueOf(value);
    }
    return null;
}

您将因此受到性能影响(尽管可以忽略不计)。

更糟糕的是下面这行:

holder.textView.setText(jsonArray.getJSONObject(i).getString("textKey"));

每当您的 View 被回收时,都会被调用。因此,性能影响成倍增加。

【讨论】:

  • Java 中 JSON 功能的相当清晰的分解。但是我们也使用 ArrayList 的 get(i) 方法。此外,如果 ArrayList 是 Model 类的类型,它也必须这样做。像 holder.textView.setText(arrayList.get(i).gettext());这种方法比你上面解释的更快吗?
  • 是的,您需要使用 get(i)。但是ArrayList.get(i) 只是通过使用i 作为快速索引从数组中获取一个项目。查看android.googlesource.com/platform/libcore/+/android-6.0.1_r77/…的源代码
猜你喜欢
  • 2011-02-24
  • 2013-06-07
  • 2013-10-31
  • 2021-10-19
  • 1970-01-01
  • 2017-01-30
  • 2021-12-11
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多