我有一个关于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个类并不是最好的方法。
提前致谢!
答案 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()
。重复FabricData
和MachineData
。