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

时间:2019-03-28 06:38:40

标签: java android

方法A(传统方法):

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

方法B:

  1. 我们从API获取JsonArray
  2. 将整个JsonArray传递给recyclerAdapter
  3. 在onBindViewHolder(不使用ArrayList)中迭代jsonArray并将setValues直接复制到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,所以我们可以忽略它。

1 个答案:

答案 0 :(得分:2)

  

使用第二种方法时,性能会有任何改善   方法,因为我们没有使用模型类和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.toString(object)的JSON对象方法调用:

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时,总是会调用

。因此,性能提升成倍增加。