2013-11-03 34 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代碼,我可以提供更多幫助。 –