在机器人的foreach的AsyncTask [英] android AsyncTask in foreach

查看:220
本文介绍了在机器人的foreach的AsyncTask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有以下的AsyncTask code:

Have the following AsyncTask code:

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

在previous code我在一个循环中调用:

the previous code I call in a loop:

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%。

Everything works fine, but the dialog does not display the correct value. First, it is worth it to 0% and then abruptly switches to 100%.

AsyncTask的调用序列(... executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ...)。

AsyncTask called in sequence (...executeOnExecutor(AsyncTask.SERIAL_EXECUTOR...).

如果您在循环运行的AsyncTask没有,所有的显示器都只是完美!

If you run a AsyncTask not in the loop, all the displays are just perfect!

安卓targetSdkVersion =14

android: targetSdkVersion = "14"

我问你的帮助。

推荐答案

您需要使用 onProgressUpdate()的AsyncTask的内部。像这样的东西(在猜测)

You need to use onProgressUpdate() inside the AsyncTask. Something like this (at a guess)

@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})

这篇关于在机器人的foreach的AsyncTask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆