2011-09-03 185 views
16

我正在使用異步任務從菜單活動中獲取字符串並加載一些東西..但我 無法做到這一點..我以正確的方式使用它,參數正確嗎? 請參閱代碼片段。感謝將參數傳遞給Asynctask

private class Setup extends AsyncTask<Void, Integer, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
      } 
     } catch (Exception e) { 
      e.getStackTrace(); 
     } finally { 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

回答

15

取而代之的是我會做

private class Setup extends AsyncTask<String, Integer, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
    String identifier = params[0]; 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

和調用的AsyncTask以防止創建的AsyncTask

這樣

if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
       new Setup().execute(identifier); 
    } 
4
的開銷之前檢查 「標識符」

一個簡單的方法是添加一個構造函數:

public Setup(String a, Int b) { 
    this.a = a; 
    this.b = b; 
} 
0

AsyncTask意味着doInBackground()返回Void,onProgressUpdate()需要整數參數,doInbackground需要... String params!

所以你不需要(並且真的不應該)使用Intent,因爲它是用來通過Activities而不是Threads傳遞參數的。

正如之前說,你可以做一個構造函數和全局參數到您的類名爲「標識符」

public class Setup... 
{ 
    private String identifier; 

    public Setup(String a) { 
    identifier = a; 
    } 
} 

希望它可以幫助。 問候

23

避免增加一個構造函數。

只需將您的paramters在任務執行方法

new BackgroundTask().execute(a, b, c); // can have any number of params 

現在你的背景類應該是這樣的

public class BackgroundTask extends AsyncTask<String, Integer, Long> { 

    @Override 
    protected Long doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     String a = arg0[0]; 
     String b = arg0[1]; 
     String c = arg0[2]; 
     //Do the heavy task with a,b,c 
     return null; 
    } 
    //you can keep other methods as well postExecute , preExecute, etc 

} 
+4

「避免增加構造」爲什麼呢?我試圖確定爲什麼使用構造函數初始化私人領域在asynctask是一個壞的東西在Android中。 – bsautner

+0

我沒有說這是一個壞主意,但只是爲了傳遞參數不通過構造函數的路線,因爲你最終會浪費記憶。 – HimalayanCoder

+1

它可能浪費多少內存? –