簡體   English   中英

Android:一個帶有兩個AsyncTask的ProgressBar

[英]Android: One ProgressBar with two AsyncTask

我有兩個AsyncTasks( MainActivity子類),它們可以同時下載一些數據。 他們被稱為

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

我希望他們倆都更新一個ProgressBar但我想不出一種方法, setProgress從兩個同時執行的線程中進行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%

這很簡單(不包含代碼,僅包含算法):

  1. 首先將進度的最大值設置為0。
  2. 當您的任何asynctasks獲得其自己的最大值時,將進度的最大值增加此值。
  3. 現在,隨着每個異步任務完成一些工作,將進度當前值增加該數量。
  4. 完成所有異步任務后,完成的工作量總計為每個異步任務最大值的總和,您將獲得100%的進度。

附帶說明一下,要使其達到完美,您可能需要在開始實際工作之前將最大進度設置為每個最大值的總和。 但是,這是一個旁注,可以丟棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM