【问题标题】:Android: One ProgressBar with two AsyncTaskAndroid:一个带有两个 AsyncTask 的 ProgressBar
【发布时间】:2013-09-07 06:52:55
【问题描述】:

我有两个异步任务(MainActivity 的子类),它们同时下载一些数据。它们由

调用

new LoadData(url).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

我希望他们俩都更新ProgressBar,但我想不出一种方法可以从两个同时执行的线程中更新setProgress,以便每个线程贡献 50% 的进度。

public class MainActivity extends Activity {
    private static double staticvariable = 0;
    private ProgressBar progbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progbar = (ProgressBar) findViewById(R.id.progressBar1);

        new LoadData("http://stackoverflow.com")
                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        new LoadData("http://stackoverflow.com")
                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    private class LoadData extends AsyncTask<String, Void, String> {
        private String weburl;

        public LoadData(String url) {
            this.weburl = url;
            System.out.println("Starting Download");
        }

        protected String doInBackground(String... params) {
            System.out.println("point 1");
            URLConnection conn = null;
            URL url = null;
            try {
                url = new URL(weburl);
                conn = url.openConnection();
                conn.connect();
                InputStream in = null;
                in = new BufferedInputStream(url.openStream());
                int fileSize = conn.getContentLength();
                double taskProgress;
                int count;
                byte buffer[] = new byte[1024];
                while ((count = in.read(buffer)) != -1) {
                    taskProgress = 50 * ((double) count) / ((double) fileSize);
                    staticvariable += taskProgress;
                    progbar.setProgress((int) staticvariable);
                }
                in.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }



            System.out.println("finished at " + (int) staticvariable + "%");
            return null;

        }
    }
}

我认为解决方案在于使用静态变量自增count/fileSize,如上所示,但我得到了一些奇怪的结果。在每次下载结束时,我将完成百分比打印到我得到的控制台:

完成率为 916%

完成率为 926%

我不知道这些数字是从哪里来的。有什么想法吗?


编辑 只运行一个 AsyncTask 输出:

完成率为 447%

【问题讨论】:

  • 您是否尝试只执行一个 AsyncTask 并检查这些数字是否更有意义?我怀疑您的静态变量增量有误。
  • @Udil Yeh 只做一个输出也不正确的进度(见编辑)
  • 尝试将 staticvariable += taskProgress 更改为 staticvariable = taskProgress 并只运行一个 AsyncTask,只是为了检查它是否真的是问题所在。
  • @Udil 如果我这样做,它会以 1% 的速度完成..
  • 增量没问题,你应该使用staticvariable += taskProgres。我认为最简单的方法就是在调试模式下测试你的代码。我刚刚用我服务器上的一个文件检查了它,结果很完美(我也会打印 fileSize 变量的值)。

标签: java android multithreading android-asynctask progress-bar


【解决方案1】:

很简单(不包括代码,只是算法):

  1. 首先将您的最大进度设置为 0。
  2. 当您的任何异步任务获得自己的最大值时,将进度的最大值增加该值。
  3. 现在,随着每个异步任务完成它们的一些工作,将进度当前值增加该数量。
  4. 当您的所有异步任务都完成后,完成的工作量将总计为每个异步任务最大值的总和,您将获得 100% 的进度。

附带说明一下,为了做到完美,您可能需要在开始实际工作之前将最大进度设置为每个单独最大值的总和。但是,这是一个旁注,可以丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多