Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么在这个例子中我需要一个Handler对象? 公共类ProgressBarTest扩展活动{ 私人投资进展; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.progress\u栏); 最终处理程序=新处理程序(); 进度=0; 最终进度条pb=(进度条)findViewById(R.id.ProgressBar); 新线程(newrunnable()){ 公开募捐{ 而(进度_Android_Multithreading_Handler - Fatal编程技术网

Android 为什么在这个例子中我需要一个Handler对象? 公共类ProgressBarTest扩展活动{ 私人投资进展; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.progress\u栏); 最终处理程序=新处理程序(); 进度=0; 最终进度条pb=(进度条)findViewById(R.id.ProgressBar); 新线程(newrunnable()){ 公开募捐{ 而(进度

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

为什么我不能将pb.setVisibility(View.GONE)放在第一个可运行的内部类中?就像这样:如果我这样写,程序就会崩溃

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);
                }
            }
        }