2013-05-26 52 views
2

在我的android活动中,我有一个asynctask下载某些url的HTML内容。但是,如果网站出现问题,它(doInbackground())只会将字符串“error”返回给onPostExecute()。 onPostExecute方法检查返回的字符串。如果返回的字符串不是“错误”,那么它会执行一些其他工作,我希望它执行另一个url的asynctask。我们可以在onPostExecute()中执行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

你认为有什么好处在调用另一个asynctas?您可以尝试连接doinbackground中的另一个链接 – stinepike

+0

连接的含义是什么?我无法得到它。 – AndroidMan

+0

你可以在同一个doInBackground本身做到这一点。为什么你需要再次调用AsyncTask来做到这一点..post你的AsyncTask代码.. – bakriOnFire

回答

0

onPreExecute和onPostExecute方法上UiThread,所以是你可以做任何你想做的事情有。只有doInBackground方法是另一个线程,所以你最好不要做任何事情会影响用户界面,但其他人都可以。

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

我觉得斯特凡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); 
相关问题