在我的android活动中,我有一个asynctask,可以下载某些网址的HTML内容。但是,如果网站出现问题,它(doInbackground())只会将字符串“error”返回给onPostExecute()。 onPostExecute方法检查返回的字符串。如果返回的字符串不是“错误”,那么它会做一些其他的工作,我希望它为另一个url执行asynctask。
这是一件好事吗?
这是AsyncTask代码:
private class DataLoader extends AsyncTask<URL,Integer,String>{
@Override
protected void onPreExecute(){
//some Stuff
}
@Override
protected String doInBackground(URL... url) {
try {
Document d = Jsoup.connect(url[0].toString()).timeout(0).get();
String docString = d.toString();
return docString;
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
@Override
protected void onPostExecute(String result){
if(!(result == "error")){
//Process the result
}
else{
DataLoader g = new DataLoader();
try {
g.execute(new URL("http://workingexample.com/"));
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
答案 0 :(得分:1)
我认为StinePike和bakriOnFire意味着这样的事情
@Override
protected String doInBackground(URL... url) {
String docString = downloadHTML(url[0].toString());
// Try another url
if (docString.equals("error")) {
docString = downloadHTML("http://stackoverflow.com");
}
// Try another url
if (docString.equals("error")) {
docString = downloadHTML("http://google.com");
}
return docString;
}
private String downloadHTML(String url) {
String docString = null;
try {
Document d = Jsoup.connect(url).timeout(0).get();
docString = d.toString();
} catch (Exception e) {
e.printStackTrace();
docString ="error";
}
return docString;
}
答案 1 :(得分:1)
我认为Stefan Leisenberger的回答有正确的想法,虽然我认为如果您在execute
调用中提供了所有网址,然后只是在doInBackground
的循环中处理它们可能会更整洁方法。
所以doInBackground
方法看起来像这样:
protected String doInBackground(URL... urls) {
int count = urls.length;
for (int i = 0; i < count; i++) {
try {
Document d = Jsoup.connect(urls[i].toString()).timeout(0).get();
String docString = d.toString();
return docString;
} catch (Exception e) {
e.printStackTrace();
}
}
return "error"; // None of the URLs worked.
}
然后你的execute
电话需要看起来像这样:
DataLoader g = new DataLoader();
g.execute(url1, url2, url3);
答案 2 :(得分:0)
onPreExecute和onPostExecute方法在UiThread上,所以是的,你可以做任何你想做的事情。只有doInBackground方法是另一个线程,所以你最好不要做任何会影响ui的事情,否则就行了。