Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
Java 使用Thread.sleep理解循环中的吐司_Java_Android_Toast - Fatal编程技术网

Java 使用Thread.sleep理解循环中的吐司

Java 使用Thread.sleep理解循环中的吐司,java,android,toast,Java,Android,Toast,我是Android开发的新手。只是想测试下面的代码,单击按钮可以执行一些任务。由于Toast是异步的,日志显示循环结束后,Toast会弹出。但是 当我注释掉Thread.sleep()(在没有Thread.sleep()的情况下循环)时,所有的祝酒词都显示在0到14之间 当Thread.sleep(1000)时,则祝酒时间从7点到14点 当Thread.sleep(500)时,祝酒词的显示范围从3到14 当Thread.sleep(2000)时,只显示第14个吐司 为什么会这样?据我所知,这

我是Android开发的新手。只是想测试下面的代码,单击按钮可以执行一些任务。由于Toast是异步的,日志显示循环结束后,Toast会弹出。但是

  • 当我注释掉Thread.sleep()(在没有Thread.sleep()的情况下循环)时,所有的祝酒词都显示在0到14之间
  • 当Thread.sleep(1000)时,则祝酒时间从7点到14点
  • 当Thread.sleep(500)时,祝酒词的显示范围从3到14
  • 当Thread.sleep(2000)时,只显示第14个吐司
为什么会这样?据我所知,这一切都发生在UI线程中。如果只有一个线程,那么toast如何异步工作

多谢各位

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int i=0;
                int j=0;
                Log.d("tag", "sec "+i);
                while(i++<15){
                    Log.d("tag", "sec "+i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    Toast.makeText(getApplicationContext(),"num"+(j),Toast.LENGTH_SHORT).show();
                    j++;
                 }

            }
        });
button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
int i=0;
int j=0;
日志d(“标签”、“第二节”+i);
而++
Toast是异步的


首先,Toast在默认情况下不是异步的

为什么会这样

使用
toast.LENGTH\u SHORT
创建的toast的生存期为2秒。现在,如果您的UI线程被锁定(因为
线程.sleep
),那么toast将不会出现在屏幕上。它将在显示之前“死亡”

如何使其按预期工作 在新创建的
线程中运行整个块
,只在主线程中创建并显示
Toast
, 你需要按照以下思路做一些事情

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                int j = 0;
                Log.d("tag", "sec " + i);
                while (i++ < 15) {
                    Log.d("tag", "sec " + i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    final int finalJ = j;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "num" + (finalJ), Toast.LENGTH_SHORT).show();
                        }
                    });
                    j++;
                }
            }
        }).start();
    }
});
注意-不要在主线程中使用
Thread.sleep
,它会阻塞用户界面并导致用户体验不佳

Toast是异步的


首先,Toast在默认情况下不是异步的

为什么会这样

使用
toast.LENGTH\u SHORT
创建的toast的生存期为2秒。现在,如果您的UI线程被锁定(因为
线程.sleep
),那么toast将不会出现在屏幕上。它将在显示之前“死亡”

如何使其按预期工作 在新创建的
线程中运行整个块
,只在主线程中创建并显示
Toast
, 你需要按照以下思路做一些事情

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                int j = 0;
                Log.d("tag", "sec " + i);
                while (i++ < 15) {
                    Log.d("tag", "sec " + i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    final int finalJ = j;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), "num" + (finalJ), Toast.LENGTH_SHORT).show();
                        }
                    });
                    j++;
                }
            }
        }).start();
    }
});

p.S-永远不要在主线程中使用
线程。睡眠
,它会阻塞用户界面并导致用户体验不佳。

默认情况下,Toast不是异步的。你能清除它吗?它何时异步运行?何时同步?异步基本上意味着操作是在不同的线程上完成的(即不在用户界面线程中)。现在,除非您明确地这样做,
Toast
s从来都不是异步的。异步并不意味着“在另一个线程上”使用Android术语,它意味着一段代码作为事件在带有
循环器的线程上调度,这通常是使用
处理程序来完成的。Android上的Toast实际上是在主线程上异步调度的。换句话说,它们作为事件排队,由主线程异步处理。如果主线程被
thread.sleep()
阻塞,那么它将无法运行任何先前排队的show toast事件,直到它被取消阻塞。toast的默认情况下不是异步的。您可以清除它吗?它何时异步和何时同步运行?异步基本上意味着操作是在不同的线程上完成的(即不在UI线程中)。现在,除非您明确这样做,
Toast
s从来都不是异步的。异步并不意味着“在另一个线程上”使用Android术语,它意味着一段代码作为事件在带有
循环器的线程上调度,这通常是使用
处理程序来完成的。Android上的Toast实际上是在主线程上异步调度的。换句话说,它们作为事件排队,由主线程异步处理。如果e主线程被
thread.sleep()
阻塞,那么它将无法运行任何先前排队的show toast事件,直到它被解除阻塞。