Android 为什么在这个例子中我需要一个Handler对象? 公共类ProgressBarTest扩展活动{ 私人投资进展; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.progress\u栏); 最终处理程序=新处理程序(); 进度=0; 最终进度条pb=(进度条)findViewById(R.id.ProgressBar); 新线程(newrunnable()){ 公开募捐{ 而(进度
为什么我不能将pb.setVisibility(View.GONE)放在第一个可运行的内部类中?就像这样:如果我这样写,程序就会崩溃Android 为什么在这个例子中我需要一个Handler对象? 公共类ProgressBarTest扩展活动{ 私人投资进展; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.progress\u栏); 最终处理程序=新处理程序(); 进度=0; 最终进度条pb=(进度条)findViewById(R.id.ProgressBar); 新线程(newrunnable()){ 公开募捐{ 而(进度,android,multithreading,handler,Android,Multithreading,Handler,为什么我不能将pb.setVisibility(View.GONE)放在第一个可运行的内部类中?就像这样:如果我这样写,程序就会崩溃 public class ProgressBarTest extends Activity { private int progress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance
public class ProgressBarTest extends Activity {
private int progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_bar);
final Handler handler = new Handler();
progress = 0;
final ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
new Thread(new Runnable() {
public void run() {
while (progress < 10) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress++;
}
handler.post(new Runnable() {
@Override
public void run() {
pb.setVisibility(View.GONE);
}
});
}
}).start();
}
}
new线程(new Runnable()){
公开募捐{
而(进度<10){
试一试{
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
进步++;
pb.setVisibility(View.GONE);
}
}
}
执行setVisibility语句时,程序崩溃。不能从线程更新ui。ui应在ui线程上更新 在第二种方法中,您在threads runs方法中设置进度条的可见性。因此它会崩溃。因此,您可以使用handler在第一种方法中设置进度条的可见性 了解更多有关处理程序的信息
不能从线程更新ui。ui应在ui线程上更新 在第二种方法中,您在threads runs方法中设置进度条的可见性。因此它会崩溃。因此,您可以使用handler在第一种方法中设置进度条的可见性 了解更多有关处理程序的信息
因此,如果我想从UI线程以外的线程更新UI,我应该始终使用处理程序?这是常见的方式吗?因为我觉得有点奇怪。Thx。@nomnom这是使用处理程序的一种方式。但是你不能从线程更新UI。你可以使用asynctask。你可以在内部使用
runOnuiThread
更新ui的线程运行方法。runOnUiThread
是一种活动方法。请检查此项以澄清问题,处理程序只是将消息添加到与其关联的线程(在本例中为ui线程)的消息队列中,因此当您使用处理程序发布更新时,您基本上是将消息发布到ui中的队列中处理程序。如果您尝试并使用您建议的方法,您实际上会尝试从非UI线程更新UI。因此,如果我想从UI线程以外的线程更新UI,我应该始终使用处理程序?这是常见的方法吗?因为我觉得有点奇怪。Thx。@nomnom这是使用处理程序的一种方法。但是您不能从线程更新ui。您可以使用asynctask。您可以在thread run方法中使用RunnuiThread
来更新ui。RunnuiThread
是一种活动方法。请检查此项以明确说明问题,处理程序只是将一条消息添加到与其关联的线程的消息队列中,在本例中是ui thread,因此当您使用处理程序发布更新时,您基本上是在UI处理程序中将消息发布到队列中。如果您尝试并使用您建议的方法,您实际上将尝试从非UI线程更新UI
new Thread(new Runnable() {
public void run() {
while (progress < 10) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
progress++;
pb.setVisibility(View.GONE);
}
}
}