【发布时间】: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