0

以下代碼當前在我的main的onCreate()中運行。我現在只是在測試。我一直試圖在AsyncTask中完成這項工作,因爲我們的目標是能夠稍後動態更新這些內容,但似乎無法找到如何做到這一點。我想知道是否有人有一些見解。謝謝!使用AsyncTask更新UI(動態佈局)

LinearLayout ObjectLayout = (LinearLayout) findViewById(R.id.LayoutObjects); 

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT, 
      RelativeLayout.LayoutParams.WRAP_CONTENT); 
    params.height = 140; 
    params.width = 140; 
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); 
    for (int i = 0; i < 10; i++) { 

     Button btn = new Button(this); 
     btn.setLayoutParams(params); 
     btn.setPadding(0, 50, 0, 0); 
     btn.setTextSize(14); 
     btn.setText("MyButton"); 
     btn.setTextColor(color.Yellow); 
     // Drawable image = Drawable.createFromPath("@drawable/add_page"); 
     // // 
     // btn.setBackgroundDrawable(image); 

     btn.setBackgroundDrawable(getResources().getDrawable(
       R.drawable.add_page)); 
     // btn.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); 

     ObjectLayout.addView(btn); 

    } 




private class GetDataTask2 extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Simulates a background job. 

     for (int i = 0; i < 10; i++) { 
      publishProgress(btn2); 
     } 

     return null; 
    } 

    protected void publishProgress(Button btn2) { 
     btn2.setLayoutParams(params2); 
     btn2.setPadding(0, 50, 0, 0); 
     btn2.setTextSize(14); 
     btn2.setText("MyButton yo yo yo "); 
     btn2.setTextColor(color.Yellow); 

     btn2.setBackgroundDrawable(getResources().getDrawable(
       R.drawable.add_page)); 
     ObjectLayout2.addView(btn2); 
     // Process width and height 
    } 

    protected void onPostExecute() { 
     // Do some stuff here 

     // Call onRefreshComplete when the list has been refreshed. 

    } 
} 

這裏這段代碼是我爲我的異步和定義的佈局和按鈕創建爲實例中mainactivity,只是爲了測試和理解這一點,但我得到的錯誤,我一直在圍繞操縱它,但似乎沒有上班。

回答

1

我必須做同樣的事情(充氣/加一次80-120左右自定義視圖爲滾動佈局),而我的AsyncTask結構是這樣的:

首先,你需要通過你的ContextLinearLayout添加到您的AsyncTask。只需使用自定義構造函數即可。

onPreExecute():顯示進度對話框或顯示「繁忙」的內容。

doInBackground():在您的循環中創建按鈕就像您一樣,但不超過該線程上的按鈕。創造/膨脹部分是大部分時間需要的,所以不用擔心。在每個循環週期結束時,publishProgress(btn)

onProgressUpdate():按照您喜歡的方式(text/padding/etc)設置按鈕(從上方傳遞),並將其添加到佈局。

onPostExecute():關閉對話框。

一個說明,使用一個線程來擴充和一個佈局不會提高速度。沒有一個AsyncTask的時間從大約2.5秒變成了超過2個。但是,通過這種方式,它可以提供一個清晰的進度對話框,而不是在UI膨脹所有視圖時掛起。它可能不會更快,但感覺反應更靈敏,這纔是真正重要的。

編輯: 對於定製構造的一個例子,檢查this question。它還顯示瞭如何跳過構造函數並將其直接傳遞給doInBackground()方法。無論哪種方式工作得很好。

+0

」首先,您需要將Context和LinearLayout傳遞給AsyncTask,只需使用自定義構造函數即可。「究竟是什麼樣子,對於愚蠢的問題抱歉,只是有點困惑。 – thekevshow

+0

添加到答案的鏈接。 – Geobits

+0

我添加了更多的代碼,關於異步我會去關於自定義構造函數後,我得到這個測試工作,並理解它好一點,只是好奇,如果你可以看看看什麼是錯的。 – thekevshow

0

AsyncTasks通常用於較長的後臺操作。所以除非你希望在完成這樣的任務之後更新你的按鈕,我不確定你爲什麼要使用它。然而,如果這確實是你的目的,那麼你會在你的AsyncTask的doInBackground()函數中執行你需要的任何任務/代碼。完成後,AsyncTask的onPostExecute()函數就是您相應更新UI的位置。

也許您可以在「動態加載」的要求中加入更多的細節,以便社區可以爲您提供更具體的答案。

+0

如果您需要更多的代碼,請告訴我,但實質上將該按鈕想象爲調用多達100或200個將被移除並添加到可滾動佈局的佈局中。代碼完成後,這將是一個更長的操作。我也使用拉下來刷新以更新這些,這就是爲什麼我認爲異步方法是適當的。上述行動本質上是我測試時需要完成的唯一例子。儘管如此,感謝您的洞察力,但如果我沒有足夠的描述性,請告訴我。 「 – thekevshow