【问题标题】:android AsyncTask in foreachforeach中的android AsyncTask
【发布时间】:2013-11-21 05:26:29
【问题描述】:

有以下 AsyncTask 代码:

private class checkChangesTask extends AsyncTask<String, Void, String> {
protected ProgressDialog mProgressDialog2; 
protected String _url = "", _idautor="", _idbook="";

@Override
protected void onPreExecute() {
    super.onPreExecute();
    this.mProgressDialog2 = new ProgressDialog(MainActivity.this);
    this.mProgressDialog2.setMessage("Check changes ...");
    this.mProgressDialog2.setIndeterminate(false);
    this.mProgressDialog2.setCanceledOnTouchOutside(false);
    this.mProgressDialog2.setCancelable(true);
    this.mProgressDialog2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    this.mProgressDialog2.setMax(100);
    this.mProgressDialog2.setProgress(0);
    this.mProgressDialog2.show();
}       

@Override
protected String doInBackground(String... params) {
    Document doc = null;
    String _html = "";
    _idautor = params[0];
    _idbook = params[1];
    _url = params[2];
    try {
    doc = Jsoup.connect(_url).userAgent("Mozilla").get();
        Elements dd = doc.select("dd");

        int size = dd.size();
        int p = 1;
        for (Element src : dd) {
            this.mProgressDialog2.setProgress(p*100/size);
            if (p <= size-1){
                _html += src.outerHtml();
                ++p;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return Jsoup.clean(_html, Whitelist.basic());           
} 
@Override
protected void onPostExecute(String result) {   
    if(!result.equals("")){
        String lastfile = readPageFile(_idautor + "_" + _idbook);
        if(!lastfile.equals(result)){
            savePageToFile(_idautor + "_" + _idbook, result);
        }
    }else{
        Toast.makeText(MainActivity.this, "Error checkChangesTask", Toast.LENGTH_SHORT).show();
    }
    this.mProgressDialog2.dismiss();
}

之前我循环调用的代码:

public void checkChanges() {
    String[][] db_books = db.selectAllBOOKS();
    if (db_books.length>0){
        for (int j = 0; j < db_books.length; j++){  
            new checkChangesTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, db_books[j][1], db_books[j][0], db_books[j][2]);
        }
    }
}

一切正常,但对话框未显示正确的值。首先,值得到 0%,然后突然切换到 100%。

按顺序调用AsyncTask (...executeOnExecutor(AsyncTask.SERIAL_EXECUTOR...)。

如果你运行一个不在循环中的 AsyncTask,所有的显示都是完美的!

android:targetSdkVersion = "14"

我请求你的帮助。

【问题讨论】:

  • 这将如何显示...您在屏幕上同时显示多个对话框...为什么循环中的 asyntask...?
  • 我从数据库中获得了书籍(页面)的列表。和支出审查 - 互联网上有任何更新吗?我花一个字一个字地检查。如果有差异 - 然后将文件与图书一起重新保存。
  • 因此您可以将整个循环移动到单个异步任务中......
  • 如果不可能呢?
  • 亲爱的人们......一切皆有可能。你正在尝试的逻辑不好......所以改变你的逻辑。或者你可以一个一个地调用所有的 asynctask。就像如果一个完成然后调用另一个。

标签: java android android-asynctask progressdialog


【解决方案1】:

您需要在 AsyncTask 中使用 onProgressUpdate()。像这样(猜测)

@Override
protected void onProgressUpdate(Integer... progress) {
    super.onProgressUpdate(progress);

    this.mProgressDialog2.setProgress(progress[0] * 100/progress[1]);
}

并替换这一行:

this.mProgressDialog2.setProgress(p*100/size);

有了这个:

 publishProgress(new int[]{p,size})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 2020-04-04
    • 2014-12-18
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多