如果我在 BindViewHolder 中迭代 JsonArray 而不是 Arraylist,性能会有什么不同吗?



方法A (常规方法):

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

方法B:

  1. 我们从 API 获取 JsonArray
  2. 将整个 JsonArray 传递给回收器适配器
  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。

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

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

注意:- 多次使用 try catch 对性能没有影响,因此我们可以忽略它。

会,当我使用第二个时会有任何性能改进 方法,因为我们没有使用模型类和数组列表。

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

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

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

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

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

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

您应该注意,JSONObject.getString("textKey")需要做一些繁重的事情来通过调用以下 getString 方法代码来查找具有键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"));

将始终在回收视图时调用。因此,性能影响成倍增加。