在 Android APP 的主线程中更新进度条
Update ProgressBar within MainThread in AndroidAPP
我有 2 个按钮 以及一个 进度条 。
现在我想从 0 - 100 计数并用计数器更新进度条。不幸的是,这个计数太快了,我看不到进度(我只能看到进度条在 'millisecond'. 内从 0 跳到 100)。
这是我到目前为止尝试过的方法,但是和以前一样发生了同样的事情。
我点击按钮启动计数器,app无响应(我在mainThread中计算,这样就OK了(以及我在这里想要完成的事情 (!))) 并且不久之后将 进度条设置为 100。 中间没有任何东西。
现在,如果您能引导我进入正确的方向,那将不胜感激! :)
public class MainActivity extends ActionBarActivity {
public String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addButtonListeners();
}
public void addButtonListeners() {
Button firstButton, secondButton;
final ProgressBar pgBar;
firstButton = (Button) findViewById(R.id.first_button);
secondButton = (Button) findViewById(R.id.second_button);
pgBar = (ProgressBar) findViewById(R.id.progressBar);
firstButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "First Button was pressed.");
for (int i = 0; i <= 100; i++) {
countProgBarUp(pgBar, i);
}
}
});
secondButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Second Button was pressed.");
}
});
}
public void countProgBarUp(ProgressBar pgBar, int counter) {
try {
Thread.sleep(100);
pgBar.setProgress(counter);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
...
}
UI 变得无响应,因为您正在主线程上执行此操作并处于休眠状态。如果您不从 onClick()
return 进行,那么主线程将无法处理 UI 更改,例如显示您的新进度。只有主线程可以更新 UI 个组件并绘制它们。因此,它通常被称为 UI 线程。
您可以尝试创建一个 Runnable
来将进度条更新为新的计数。创建绑定到 UI 线程的 Handler
并为 Handler
调用 postDelayed()
并为其提供 Runnable
的实例。然后在 Runnable
中再次 post 只要你还没有达到最大进度。
我有 2 个按钮 以及一个 进度条 。 现在我想从 0 - 100 计数并用计数器更新进度条。不幸的是,这个计数太快了,我看不到进度(我只能看到进度条在 'millisecond'. 内从 0 跳到 100)。
这是我到目前为止尝试过的方法,但是和以前一样发生了同样的事情。
我点击按钮启动计数器,app无响应(我在mainThread中计算,这样就OK了(以及我在这里想要完成的事情 (!))) 并且不久之后将 进度条设置为 100。 中间没有任何东西。
现在,如果您能引导我进入正确的方向,那将不胜感激! :)
public class MainActivity extends ActionBarActivity {
public String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addButtonListeners();
}
public void addButtonListeners() {
Button firstButton, secondButton;
final ProgressBar pgBar;
firstButton = (Button) findViewById(R.id.first_button);
secondButton = (Button) findViewById(R.id.second_button);
pgBar = (ProgressBar) findViewById(R.id.progressBar);
firstButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "First Button was pressed.");
for (int i = 0; i <= 100; i++) {
countProgBarUp(pgBar, i);
}
}
});
secondButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Second Button was pressed.");
}
});
}
public void countProgBarUp(ProgressBar pgBar, int counter) {
try {
Thread.sleep(100);
pgBar.setProgress(counter);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
...
}
UI 变得无响应,因为您正在主线程上执行此操作并处于休眠状态。如果您不从 onClick()
return 进行,那么主线程将无法处理 UI 更改,例如显示您的新进度。只有主线程可以更新 UI 个组件并绘制它们。因此,它通常被称为 UI 线程。
您可以尝试创建一个 Runnable
来将进度条更新为新的计数。创建绑定到 UI 线程的 Handler
并为 Handler
调用 postDelayed()
并为其提供 Runnable
的实例。然后在 Runnable
中再次 post 只要你还没有达到最大进度。