2013-12-11 50 views
0

我有一個關於的AsyncTask quastion,我希望有人爲可以給我一些建議。我正在執行AsyncTasks以從互聯網獲取數據。這個任務是在一個單獨的課堂上。我有多個AsyncTasks執行完全相同的操作,但他們在不同的時刻被調用並將數據傳回不同的方法。在當前的AsyncTask中,我可以執行它並提供一個或多個url作爲參數。Android的 - 通過額外的參數的AsyncTask

我的問題是:有沒有一種方法來發送一個額外的參數給的AsyncTask,這樣我可以在onPostExecute使用的開關情況來決定,其中的Webdata應該去?

這是的AsyncTask類之一:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 

import android.os.AsyncTask; 
import android.util.Log; 

public class GetContactpersoonFromWeb extends AsyncTask<String, Void, String> { 
String result = ""; 
String webData; 
FirstScreen activity; 

public GetContactpersoonFromWeb(FirstScreen activity) 
{ 
    this.activity = activity; 
} 


protected String doInBackground(String... urls) { 

    HttpClient httpClient = new DefaultHttpClient(); 
    HttpContext localContext = new BasicHttpContext(); 
    HttpGet httpGet = new HttpGet(urls[0]); 
    HttpResponse response; 
    try { 
     response = httpClient.execute(httpGet, localContext); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     String line = null; //vanaf niks beginnen 
     while ((line = reader.readLine()) != null) { 
      result += line + "\n"; 
     } 
     this.webData = result;   
    } 
    catch (Exception e) {   
     Log.d("info","error bij het ophalen van de data", e); 
    } 
    return this.webData;    
} 

protected void onPostExecute(String result) { 
    this.webData = result; 
    activity.getContactpersoonData(webData); 
} 

}

與其他AsyncTasks不同的是最後一個規則:activity.getFabricData(webData); 在其他類,它是:activity.getMachineData(webData);等。

有沒有人有一個想法如何只用1級實現這一目標?我認爲使用7個課程只有1個差異規則並不是最好的方法。

在此先感謝!

+2

傳遞價值的AsyncTask的構造和使用它。 – Raghunandan

回答

2

添加在此基礎上,你會在你的構造函數執行你的switch

public GetContactpersoonFromWeb(FirstScreen activity,int yourExtraData) 
{ 
    this.activity = activity; 
    mExtraData = extraData; 
} 

,然後用mExtraDataonPostExecute

+0

嗯,這是方式更簡單,比我因子評分。它的工作原理,謝謝!:) – GeertG

+0

歡迎您。如果它有幫助,你可以接受答案。 – Apoorv

+0

我會的,但我需要等到我被允許接受;) – GeertG

1

您需要創建在AsyncTask一個額外的變量,並添加額外的日期構造函數中的參數如

public GetContactpersoonFromWeb(FirstScreen activity,int extra) 

{

this.activity = activity; 
    this.extra=extra; 

}

然後你就可以在交換機中使用此值喜歡

switch(extra){` 
................ 
................. 
0

@失眠者的回答將正常工作,但還有另一種值得考慮的選擇。只要你知道在哪裏的數據需要在創建AsyncTask之前去的,針對不同的onPostExecute()行爲的另一選擇是使用多態,而不是switch。這使您可以在將來添加其他類型的行爲,而不會破壞現有代碼。該技術是在這裏解釋:http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

在你的情況下,你的代碼GetContactpersoonFromWeb移動到一個抽象基類,比如說,GetFromWeb,然後從GetFromWebGetContactpersoonFromWeb繼承和覆蓋onPostExecute()。重複FabricDataMachineData