2012-05-02 135 views
0

是否有任何使用AsyncTask而不傳入任何參數?我目前正在傳遞一個空字符串,但我沒有做任何事的:使用異步任務

DownloadWebPageTask task = new DownloadWebPageTask(); 
    task.execute(new String[] { "" }); 

    class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
    private final ProgressDialog dialog = new ProgressDialog(MainScreen.this); 
    @Override 
     protected void onPreExecute() { 
      dialog.setMessage("Gathering data for\n"+selectedSportName+".\nPlease wait..."); 
      dialog.show(); 
     } 


    @Override 
    protected String doInBackground(String... urls) { 
     //go do something 
     return ""; 
    } 



    @Override 
    protected void onPostExecute(String result) { 
     dialog.dismiss(); 
     startTabbedViewActivity(); 
    } 
} 

private void startTabbedViewActivity(){ 
    Intent intent = new Intent(MainScreen.this, TabbedView.class); 
    intent.putExtra(SPORT_NAME_EXTRA, selectedSportName); 
    intent.putExtra(HEADLINES_FOR_SPORT_EXTRA, existingSportHeadlines.get(selectedSportName)); 
    intent.putExtra(SCORES_FOR_SPORT_EXTRA, existingSportScores.get(selectedSportName)); 
    intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA, existingSportSchedule.get(selectedSportName)); 
    startActivity(intent); 
} 

出於某種原因,當我運行如圖所示的代碼,並沒有在doInBackground發生(),對話框自敗,並啓動TabbedView活動。

但是,當我使用doInBackground()運行一些代碼時,對話框消失了,但TabbedView活動不會啓動。所以我想知道我是否可以做任何不同的事情?

+0

對於你的問題看我的答案的第一部分。對於第二部分,您可以在「doInBackground()」中運行代碼時是否放置斷點並查看是否調用了'onPostExecute()'? –

+0

當然,我會給那個鏡頭 –

+0

那麼onPostExecute()的方法簽名是什麼?它說它必須重寫超類型,刪除@override註釋 –

回答

5

是的,你可以使用AsyncTask而不是將String傳遞給doInBackground()方法。

只要改變第一和第三泛型從StringVoid

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

} 

From the doc:

由異步任務中使用的三種類型的有以下幾種:

1)PARAMS ,執行時發送給任務的參數的類型。

2)的進展,所述

3)背景計算期間發佈的進展單元的類型。結果,背景計算結果的類型。

對於onPostExecute簽名試試這個:

@Override 
protected void onPostExecute(Void unused) { 

} 

編輯

對於它實際上是非常簡單的參數。

考慮一下:

class MyTask extends AsyncTask<Type1, Type2, Type3> { 
    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected Type3 doInBackground(Type1... param) { 
    } 

    @Override 
    protected void onProgressUpdate(Type2... progress) { 
    } 

    @Override 
    protected void onPostExecute(Type3 result) { 
    } 
} 

爲了確定類型12型的Type3應該是什麼,你要問自己三個問題:

  • 我應該將哪個參數傳遞給我的任務? =>的Type1

  • 什麼是需要在處理過程中要顯示的中間結果的類型? =>
    類型2

  • 什麼是所得到的操作的類型?=>的Type3

在你的情況,我不知道在全球您是從下載數據的URL是否定義或者你想將它傳遞給任務。如果它是全球定義的,那麼你不需要Type1應該是虛空

如果你想將它傳遞給了任務,那麼你可以將它傳遞給doInBackground()方法和的Type1字符串

顯然,對於你的情況,你不需要擔心2型因爲你沒有發佈任何中間結果,並因爲你沒有在onPostExecute()與結果做任何事情,然後Type3Void了。

總之你必須:

class DownloadWebPageTask extends AsyncTask<String, Void, Void> { 
     @Override 
     protected Void doInBackground(String... urls) { 
     // do something with urls[0] 
     } 

     @Override 
     protected void onPostExecute(Void unused) { 
     // dismiss pd and start new intent 
     } 
} 

或者:

class DownloadWebPageTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { 

     } 

     @Override 
     protected void onPostExecute(Void unused) { 
     // dismiss pd and start new intent 
     } 
} 

根據您的需求。這足夠清楚了嗎?

+0

多數民衆贊成的事情,背景計算沒有返回任何東西,其在我的班級修改成員變量 –

+0

是的我忘了第三個參數...編輯! –

+0

so ? –

1

您簡單指定VoidAsyncTask仿製藥

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

看那AsyncTask generics部分

+1

這是正確的答案。請注意,如果您願意,也可以使用匿名類。 –