方法A (常规方法):
- 我们从 API 获取 JsonArray
- 迭代 JsonArray(内部 for 循环)并将值从 JsonArray 传递到模型类的对象(Getter 和 Setter),并将模型类的该对象添加到 ArrayList
- 将该数组列表传递给回收器适配器
- 在 recyclerAdapter 的 onBindViewHolder 方法中迭代该 ArrayList
- 并在 onBindViewHolder 方法中将值设置为 textView、imageView 等
方法B:
- 我们从 API 获取 JsonArray
- 将整个 JsonArray 传递给回收器适配器
在 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"));
将始终在回收视图时调用。因此,性能影响成倍增加。