2013-10-12 51 views
0

我正在努力獲得更好的處理AsyncTask,並試圖通過asyncTask的onPostExecute()動態創建控件。Android - 動態創建控件在AsyncTask onPostExecute

我在下面的代碼確實工作,它創建控件,但是有沒有辦法來循環這個,但延遲它,使變量I在asynctask完成後遞增?

我已經閱讀了使用get()方法,但我似乎無法使其工作。

任何人都可以建議如何等待,直到後臺任務完成或其他方式動態創建控件基於變量號碼?

package com.example.dynamicallycreatecontrols; 

import java.util.concurrent.ExecutionException; 
import java.util.concurrent.TimeUnit; 
import java.util.concurrent.TimeoutException; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.util.Log; 
import android.view.Menu; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class MainActivity extends Activity { 

      Integer i = 0; 


      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState); 
          setContentView(R.layout.activity_main); 

          while (i < 5) { 
                  new createControl().execute(i); 
                  i++; 
          } 

      } 

      @Override 
      public boolean onCreateOptionsMenu(Menu menu) { 
          // Inflate the menu; this adds items to the action bar if it is present. 
          getMenuInflater().inflate(R.menu.main, menu); 
          return true; 
      } 


      //asynctask 
      public class createControl extends AsyncTask<Integer, Void, Button> { 


          Button btn = new Button(MainActivity.this); 
          LinearLayout ll = (LinearLayout) findViewById (R.id.llMain); 
          LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 

          protected void onPreExecute(Integer i) { 
              // nothing right now 
          } 

          @Override 
          protected Button doInBackground(Integer... arg0) { 
              // TODO Auto-generated method stub 
              // do the calculation 

              return null; 
          } 

          protected void onPostExecute(Button v) { 
              // build the controls here 
              btn.setText("Play" + i); 
              ll.addView(btn, lp); 
              SystemClock.sleep(1000); 

          } 


      } 

} 

我是新的android開發和Java,所以我不知道如果我只是誤解獲取的概念(),或是否有更好的方式來做到這一切在一起。

感謝您隨時分配援助。

-nick

+0

如果你不這樣做創建按鈕之前的任何繁重的工作,就沒有必要使用的AsyncTask的。 – vovkab

+0

@vovkab我工作的主要應用程序從互聯網上下載文件列表,並使用它來加載樣本音樂供用戶聽。所以在創建按鈕之前需要完成大量的工作。 到目前爲止我能找到的是沒有辦法暫停或延遲一個異類。所以我在看使用處理程序,但這也沒有太大的幫助... –

+0

所以你必須使用AsyncTask,做doInBackground中的所有網絡工作。並在onPostExecute中更新您的按鈕或ListView。很簡單。 – vovkab

回答

0

doInBackground()做我搬到onPostExecute()。我不需要任何延誤。當我打電話task.execute(/**/)實際上我調用doInBackground()異步任務,我不在乎什麼時候完成,但我知道我有回調onPostExecute(),我等待並更新我的主線程從那裏。

爲了讓它更清晰可以說,你有應用程序,用戶想要註冊到服務器和更新GUI導致綠色。按鈕和調用方法用戶按下registerClient()

此方法運行:

private void registerClient(){ 
... 
dialog = ProgressDialog.show(LoginActivity.this, "", "Connecting. Please wait...", true); 
HeavyTask task = new HeavyTask(); 
task.execute(user, password, domain); 
} 

所以我們在HeavyTask

private class HeavyTask extends AsyncTask<String, Void, Void> { 

     private String username = ""; 
     private String domain = ""; 
     private String password = ""; 

      // run async task 
     protected Void doInBackground(String... args) {   

      username = args[0]; 
      password = args[1]; 
      domain = args[2];    

      registerClientToServer(username, password, domain, null);    

      return null; 
     } 

      protected void onPostExecute(Void results) { 

     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() {     
       updateGUI(username, domain);      
      } 
     }, 500);    
    } 
} 
0

爲什麼不創建一個對象,並對其進行實例化?您可以控制對象是否存在,或者是否已經完成了他必須做的事情。

例子:

public class MainActivity extends Activity { 
     private createControl cc = null; 
     Integer i = 0; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 

         while (i < 5) { 
          if (cc == null){ 
            cc = new createControl(); 
            cc.execute(i); 
            i++; 
          } 
         } 
     } 

... 

}

然後在onPostExecute只需添加cc = null;

+0

我試圖這樣做的主要原因是因爲控件的數量將基於一些本地樂隊將上傳到他們的服務器和他們的應用程序將下載的樣本歌曲。 所以我試圖排序一種方式來流化mp3,併爲每一個創建控件,如樣本歌曲列表,每個都有自己的控件。 這有道理嗎? –