我的活动有一个ProgressBar.当开始活动时,我会检查从另一个地方获取的值并更新到ProgressBar.这是我的代码:
- final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar_detail);
- final TextView progressText = (TextView) findViewById(R.id.progressText_detail);
- final ImageView btnCancel = (ImageView) findViewById(R.id.imgCancel_detail);
- progressBar.setVisibility(View.VISIBLE);
- progressText.setVisibility(View.VISIBLE);
- btnCancel.setVisibility(View.VISIBLE);
- Thread t = new Thread() {
- public void run() {
- ((Activity) ctx).runOnUiThread(new Runnable() {
- public void run() {
- int oldProgress = 0;
- while (progressBar.getProgress() < 100) {
- int value = Downloader.progress.get(gameId+ "");
- if (value != oldProgress) {
- oldProgress = value;
- progressBar.setProgress(value);
- progressText.setText(value + " %");
- }
- }
- }
- });
- }
- };
- t.start();
ProgressBar的值来自int value = Downloader.progress.get(gameId)并且它是正确的.但是,当我运行此代码时,活动没有响应,也没有显示任何内容(但应用程序没有崩溃).看起来像更新ProgressBar的线程正在运行并阻止UI线程,因此活动布局没有显示.
解决方法
您正在UI线程中运行一段时间(progressBar.getProgress()< 100)(您使用runOnUiThread),因此UI线程将被阻止(并且不会被绘制),直到此循环结束. 您可以:
>将runOnUiThread放入循环中,也许在de runOnUiThread调用内部进行休眠.但是,它不是首选的解决方案,因为您使用太多cpu来查找值更改.睡眠接近它有点难看但解决了cpu问题.它会像::
>将runOnUiThread放入循环中,也许在de runOnUiThread调用内部进行休眠.但是,它不是首选的解决方案,因为您使用太多cpu来查找值更改.睡眠接近它有点难看但解决了cpu问题.它会像::
- Thread t = new Thread() {
- public void run() {
- int oldProgress = 0;
- while (progressBar.getProgress() < 100) {
- ((Activity) ctx).runOnUiThread(new Runnable() {
- public void run() {
- int value = Downloader.progress.get(gameId+ "");
- if (value != oldProgress) {
- oldProgress = value;
- progressBar.setProgress(value);
- progressText.setText(value + " %");
- }
- }
- }
- Thread.sleep(500);
- }
- });
- }
- };