2013-11-03 32 views
0

我想添加视图到我的LinearLayout而不会阻塞UI。Android - 无阻挡UI的addView

@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

+0

runOnUiThread?你有没有尝试过,如果你使用它会更好一点。 – Tsunaze

+0

为什么不使用listView?你可以让它更有效率。 BTW postExecute在UIThread上运行@Tsunaze – Devrim

+0

我不使用listView,因为我使用的是ScrollView。 –

回答

0

它会阻止用户界面,因为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); 
    } 
} 
+0

E/AndroidRuntime(24345):java.lang.IllegalStateException:指定的子项已具有父项。您必须先调用子对象的父对象的removeView()。 –

+0

我只想指出为什么它会阻止用户界面。我认为你应该在这里改变你的方法。例如,使用适配器而不是为每个图像添加线性布局。如果您发布了所有AsyncTask代码,我可以提供更多帮助。 –