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% で終了