2014-01-26 59 views
1

我試圖發送電子郵件爲assync任務。但我不知道如何將不同的參數傳遞給doInBackground?Android的asynctask,如何傳遞幾個不同的參數來執行方法?

我想通過這樣的數據:

上下文CTX,字符串typeOfEmail,地圖數據

我怎樣才能將它傳遞到的AsyncTask類?

private class LongOperation extends AsyncTask<String, Void, String> { 
@Override 
     protected String doInBackground(String... params) { 
      for (int i = 0; i < 5; i++) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return "Executed"; 
     } 

public boolean sendLogsByEmail(Context ctx, String typeOfEmail , Map<String, String> data) { 

感謝您的任何建議。

+0

可以使用對象PARAMS – Luc

+0

看到http://stackoverflow.com/questions/3921816/can-i-pass-different-types-of-parameters-to-an-asynctask-in-android –

回答

0

只需要聲明的參數是你想傳遞的對象的共同父類型,這是Object的:

private class LongOperation extends AsyncTask<Object, Void, String> { 
    @Override 
    protected String doInBackground(Object... params) { 
     Context c = (Context) params[0]; 
     String typeOfEmail = (String) params[1]; 
     Map data = (Map) params[2]; 

     for (int i = 0; i < 5; i++) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     return "Executed"; 
    } 

現在調用execute這樣的:

myLongOperation.execute(context, emailType, data); 
+0

是數組真'execute'調用需要嗎? –

+0

是的,它絕對是。 –

+0

這讓我感到困惑,爲什麼在這種情況下,我不能一個接一個地傳遞參數,就像'String.format'。 –

0

當你定義一個AsyncTask,你正在擴展它的類。所以,沒有什麼能夠阻止你也實現你自己的方法,你可以簡單地定義:

public void my_vars(Context context, String str, Map map) { mycontext = context; mystr = str, mymap = map; } 

,並要求您​​方法之前調用它。

2

對於更復雜的參數,你可以添加構造函數:

public LongOperation (Context ctx, String typeOfEmail, Map data) { 
    /// here initialize LongOperation class instance fields 
} 

也,其safier把上下文到了WeakReference您的AsyncTask裏面,所以它看起來像:

WeakReference<Context> ctx; 

,然後使用:

Context ctxe = ctx.get(); 
if (ctxe != null) { 
    // do something with Context 
} 

這樣你就不會引入可能發生的引用泄漏d uring配置更改/或正常的活動生命週期。但是因爲你的AsyncTask是活動類的內部(我從你的代碼中得到),所以它已經隱含了對封裝類的引用 - 這可能是Activity。

0

你可以這樣做

new LongOperation().execute(new String[5]/* or add many parameter of string type*/); 

你還可以創建類LongOperation一個參數的構造函數,然後在構造函數中傳遞而產生的obj。

相關問題