我们可以在onPostExecute()中执行AsyncTask吗?

时间:2013-05-26 06:58:39

标签: java android android-asynctask

在我的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();
            }
                     }

    }
}

3 个答案:

答案 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的事情,否则就行了。