2013-01-10 100 views

回答

78
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 

public class AsyncExample extends Activity{ 


private String url="http://www.google.co.in"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 


@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    new AsyncCaller().execute(); 

} 

private class AsyncCaller extends AsyncTask<Void, Void, Void> 
{ 
    ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     //this method will be running on UI thread 
     pdLoading.setMessage("\tLoading..."); 
     pdLoading.show(); 
    } 
    @Override 
    protected Void doInBackground(Void... params) { 

     //this method will be running on background thread so don't update UI frome here 
     //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here 


     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     //this method will be running on UI thread 

     pdLoading.dismiss(); 
    } 

    } 
} 
+0

Thanx! 這看起來像我想要的......:D – omerjerk

+0

我很高興幫助:-) –

+0

Mehul Ranpara和Mehul Joisar在這裏的真正區別是Joisar需要幫助而沒有提出問題,但Ranpara想要激怒其他所有看起來相似的人在這個崗位......。因此,我向Mehul Joisar致以誠摯的問候,回答這個問題,無論國家如何...... – Vincy

6

爲什麼你不想傳遞任何參數?你應該解釋一下......

這是怎麼回事通常工作(例如):

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

,並執行它,你的呼叫:

new DownloadFilesTask().execute(url1, url2, url3); 

來源:Android docs

+0

通常,參數傳遞給'AsyncTask'但不是必要的 – codeMagic

+0

沒有必要給我傳遞參數'doInBakground'。 此方法只能通過POST方法在我的Web服務器上打開一個php文件。我只需要從該PHP文件獲得響應。所以我不需要將任何參數傳遞給'doInBackground'。 – omerjerk

+0

簡單 - 您只需使用'Void'類。所以你應該有'private class DownloadFilesTask extends AsyncTask {'。 –

6

創建AsyncTask類,就好像你不想傳遞任何參數到doInBackground

public class LongOperation extends AsyncTask<Void, Void, String> { 


      public LongOperation(Context context) { 

      } 

      @Override 
      protected void onPreExecute() { 

      } 

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

       return null; 
      }  

      @Override 
      protected void onPostExecute(String result) {       

      } 
    } 

和啓動的AsyncTask如不經過任何參數來執行:

LongOperation longOperation = new LongOperation(this); 
    longOperation.execute(); 
+0

我注意到Android Studio自動完成不會給你「」,它可能會讓你感覺不舒服。另外,請注意'doInBackground'的返回必須是該類的第三個參數(在所示示例中爲「String」)。 – Fattie

12

根據AsyncTask,其

AsyncTask<Params, Progress, Result> 
  • PARAMS,發送到的參數的類型執行任務。
  • 進度,在 背景計算期間發佈的進度單位的類型。
  • 結果,後臺計算結果的類型。

所以,如果你想通過虛空中doInBackground只是傳遞無效到位則params的。

示例代碼:

class DownloadLink extends AsyncTask<Void, Void, Void> { 


     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      //Do Your stuff here.. 
      return null; 
     } 
    } 

,並調用它爲:

new DownloadLink().execute(); 
+0

這意味着params是任務的數組,並且所有任務的返回類型都是void – blackHawk

+0

@blackHawk - 是 –