Android - addView而不阻止UI

时间:2013-11-03 20:24:06

标签: android json

我想在不阻止用户界面的情况下向我的LinearLayout添加观看次数。

@Override
protected void onPostExecute(RequestMySellingList result)
{

   for (MySellingData data : result.data)
   {
         LinearLayout rowSelling = (LinearLayout) inflater.inflate(R.layout.row_selling_item, null);

         ImageView iv_sellingItemImage = (ImageView) rowSelling.findViewById(R.id.iv_sellingItemImage);

         iv_sellingItemImage.setImageBitmap(data.bitmap);

         // Add rowSelling to the main list holder
         ll_sellingList.addView(rowSelling);
  }
}

注意: ll_sellingListLinearLayout,其中包含条目

我无法使用onProgressUpdate(),因为我得到了一个很长的json响应,我必须使用onPostExecute()方法来获取完整的json请求。

问题是如果请求很长 - addView会阻止UI

2 个答案:

答案 0 :(得分:0)

它将阻止UI,因为inflater.inflate()是一个繁重的操作。此外,findViewById也不是一个廉价的操作。你在for循环中多次调用它们。所以,最好将它们移出for循环。尝试在不阻止UI的情况下更快地运行。

@Override
protected void onPostExecute(RequestMySellingList result)
{

     LinearLayout rowSelling = (LinearLayout) inflater.inflate(R.layout.row_selling_item, null);

     ImageView iv_sellingItemImage = (ImageView) rowSelling.findViewById(R.id.iv_sellingItemImage);

     for (MySellingData data : result.data)
     {
          iv_sellingItemImage.setImageBitmap(data.bitmap);

          // Add rowSelling to the main list holder
          ll_sellingList.addView(rowSelling);
     }
}

答案 1 :(得分:0)

在使用手风琴样式布局时,我能够做到这一点,其中每个折叠项也包含列表的一个子集,因为这种布局不适用于 RecyclerView Viewholder 模式。我使用 Concurrent 作为 Asynctask 的替代品,然后在 doInBackground 所有 Glide 获取图像和 addView() 调用都使用 new Handler(Looper.getMainLooper()).post(() -> {//Your Code}); 包装,因为 Glide 和添加视图要求它在 UI 线程上运行。每个布局的添加都会在屏幕上一一看到,但好在 Choreographer 不再跳帧。