【问题标题】:Can we execute the AsyncTask in onPostExecute()?我们可以在 onPostExecute() 中执行 AsyncTask 吗?
【发布时间】:2013-05-26 06:58:38
【问题描述】:

在我的 android 活动中,我有一个 asynctask 可以下载某些 url 的 HTML 内容。但是,如果网站有问题,它(doInbackground()) 只会将字符串“error”返回给 onPostExecute()。 onPostExecute 方法检查返回的字符串。如果返回的字符串不是“错误”,那么它会做一些其他工作,否则我希望它为另一个 url 执行异步任务。

这是一件好事吗?

这里是 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();
            }
                     }

    }
}

【问题讨论】:

  • 你认为调用另一个 asynctas 有什么好处吗?您可以尝试连接 doinbackground 中的其他链接
  • 连接是什么意思?我无法得到它。
  • 您可以在同一个 doInBackground 本身中执行此操作..为什么您需要再次调用 AsyncTask 来执行此操作..发布您的 AsyncTask 代码..

标签: java android android-asynctask


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我认为 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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        相关资源
        最近更新 更多