1

MainActivity私はいくつかのデータを同時にダウンロードする2 つの AsyncTasks (のサブクラス) を持っています。彼らはによって呼び出されます

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

両方に更新してもらいたいのですが、2 つの同時スレッドから各スレッドが進行状況の 50% を占めるProgressBarようにする方法は考えられません。setProgress

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 出力を 1 つだけ実行する編集:

447% で終了

4

1 に答える 1

0

シンプルです (コードは含まれず、アルゴリズムのみ):

  1. 進行状況の最大値を 0 に設定することから始めます。
  2. asynctasks のいずれかが独自の最大値を取得すると、この値によって進行状況の最大値が増加します。
  3. ここで、各 asynctasks が作業の一部を完了すると、進行状況の現在の値をその量だけ増やします。
  4. すべての asynctasks が完了すると、完了した作業量が各 asynctask の最大値の合計になり、100% の進捗が得られます。

補足として、これが完全に完璧であるためには、実際の作業を開始する前に、最大進行状況を個々の最大値の合計に設定する必要があります。ただし、これは補足事項であり、破棄することができます。

于 2013-09-03T23:08:03.483 に答える