2

在我的 android 活动中,我有一个 asynctask 可以下载一些 url 的 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();
            }
                     }

    }
}
4

3 回答 3

1

我认为 Stefan Leisenberger 的回答有正确的想法,尽管我认为如果您在execute调用中提供所有 URL,然后在您的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);
于 2013-05-26T10:39:41.060 回答
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;
}
于 2013-05-26T07:53:35.270 回答
0

onPreExecute 和 onPostExecute 方法在 UiThread 上,所以是的,你可以在那里做任何你想做的事情。只有 doInBackground 方法是另一个线程,所以你最好不要做任何会影响 ui 的事情,否则就可以了。

于 2013-05-26T07:46:49.903 回答