Android - 将额外参数传递给AsyncTask

时间:2013-12-11 12:07:59

标签: android parameters android-asynctask

我有一个关于AsyncTask的问题,我希望somone可以给我一些建议。我正在执行AsyncTasks以从互联网获取数据。任务是在一个单独的类中。我有多个AsyncTasks执行完全相同的操作,但它们会在不同时刻被调用并将数据传递回不同的方法。在当前的AsyncTask中,我可以执行它并将一个或多个url作为参数。

我的问题是:有没有办法向AsyncTask发送一个额外的参数,以便我可以在onPostExecute中使用switch case来决定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个课程来实现这一目标?我认为使用只有1条差异规则的7个类并不是最好的方法。

提前致谢!

3 个答案:

答案 0 :(得分:2)

根据您在构造函数

中执行switch的日期添加日期
public GetContactpersoonFromWeb(FirstScreen activity,int yourExtraData)
{
   this.activity = activity;
   mExtraData = extraData;
}

然后在mExtraData

中使用onPostExecute

答案 1 :(得分:1)

你需要在AsyncTask中创建一个额外的变量,并在构造函数中添加额外的参数,如

public GetContactpersoonFromWeb(FirstScreen activity,int extra)

{

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

}

然后你可以在像

这样的开关案例中使用这个值
switch(extra){`
................
.................

答案 2 :(得分:0)

@ insomniac的回答会很好,但还有另外一个选择。如果您在创建AsyncTask之前知道数据需要去哪里,则针对不同onPostExecute()行为的另一个选项是使用多态而不是switch。这允许您在将来添加其他类型的行为,而不会有破坏现有代码的风险。这里解释了这项技术:http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

在您的情况下,您将代码从GetContactpersoonFromWeb移至抽象基类,例如GetFromWeb,然后让GetContactpersoonFromWeb继承自GetFromWeb并覆盖onPostExecute()。重复FabricDataMachineData