Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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中,如何让等待/睡眠以我想要的方式工作?_Java_Android_Multithreading_Sleep - Fatal编程技术网

在java中,如何让等待/睡眠以我想要的方式工作?

在java中,如何让等待/睡眠以我想要的方式工作?,java,android,multithreading,sleep,Java,Android,Multithreading,Sleep,我正在努力完成一件非常简单的事情。首先,加载我的布局(main.xml)。然后等待1秒,修改图像,等待1秒,然后将其修改为第三个图像。(当然,我的最终目标更为复杂,但我甚至无法实现这一目标) 基本上,当应用程序加载时,我会看到一个黑屏。它一直保持这种状态,直到所有等待结束,然后显示最终图像。这是我的密码: super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageCard[0] = (Imag

我正在努力完成一件非常简单的事情。首先,加载我的布局(main.xml)。然后等待1秒,修改图像,等待1秒,然后将其修改为第三个图像。(当然,我的最终目标更为复杂,但我甚至无法实现这一目标)

基本上,当应用程序加载时,我会看到一个黑屏。它一直保持这种状态,直到所有等待结束,然后显示最终图像。这是我的密码:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);        

ImageCard[0] = (ImageView)findViewById(R.id.imageView11);
Thread.sleep(1000);
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.secondimage));
Thread.sleep(1000);
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.thirdimage));
ImageCard[0]是我尝试更改的图像。它加载到main.xml中,如果我删除其余代码,它会显示良好

如果我将睡眠时间更改为5000,则需要10秒,然后它才能最终离开黑屏并显示第三幅图像。这就是为什么我知道它不只是加载速度慢,而是在等待

好像它不是按顺序运行的。我不是java专家,所以我假设我在做一些愚蠢的事情


谢谢你的帮助

尝试添加ImageCard[0]。当你想让它画图时,将其作废。

尝试添加ImageCard[0]。当你想让它画图时,将其作废。

我认为装满鳗鱼的气垫船正指引着你正确的方向。本质上,您没有执行任何多线程,而是告诉主线程等待,这意味着它永远不会完成绘图。我不确定Android,但Swing默认使用双缓冲(以避免屏幕闪烁),但这意味着所绘制的内容实际上是绘制到缓冲区,而不是窗口本身,这就是为什么您看不到任何内容。您可以尝试禁用双缓冲(Android可能正在使用),但这可能会导致其他问题


您可能想要实际执行多线程,或者,我相信Android可能有一个计时器组件。如果是的话,我建议您在Thread.sleep或实际的多线程上使用它。使用计时器,您可以让它在一秒钟后触发事件。该事件将执行另一个代码。

我认为装满鳗鱼的气垫船为您指明了正确的方向。本质上,您没有执行任何多线程,而是告诉主线程等待,这意味着它永远不会完成绘图。我不确定Android,但Swing默认使用双缓冲(以避免屏幕闪烁),但这意味着所绘制的内容实际上是绘制到缓冲区,而不是窗口本身,这就是为什么您看不到任何内容。您可以尝试禁用双缓冲(Android可能正在使用),但这可能会导致其他问题


您可能想要实际执行多线程,或者,我相信Android可能有一个计时器组件。如果是的话,我建议您在Thread.sleep或实际的多线程上使用它。使用计时器,您可以让它在一秒钟后触发事件。该事件将执行其他代码。

好的,这是您的问题,当您在UIThread中时,您永远无法执行睡眠(…)。UIThread永远不会被锁定,它会导致android中发生很多非常糟糕的事情。但是有一种非常简单的方法,只要离开UIThread,在需要时跳回到UIThread上。以下是我的建议:

public void onCreate(...)
{
    super.onCreate(...);
    myActivity.setContentView(R.layout.main);
    new Thread(this).start();
}

public void run()
{
    try
    {
        changeLayout(R.layout.main2);
        Thread.sleep(5000);
        changeLayout(R.layout.main3);
        Thread.sleep(10000)
        changeLayout(R.layout.main4);
    }catch(Exception e){}
}

public void changeLayout(int id)
{
    this.id = id;
    myActivity.post(new Runnable()
    {
        public void run()
        {
            myActivity.setContentView(id);
        }
    });
}

private int id;

当然,在这个示例中,类必须实现Runnable才能工作。只有UIThread可以访问UI,其他线程无法访问。这就是为什么您必须跳上跳下UIThread。希望这能奏效

好的,这是你的问题,当你在UIThread中时,你永远不能进行睡眠(…)。UIThread永远不会被锁定,它会导致android中发生很多非常糟糕的事情。但是有一种非常简单的方法,只要离开UIThread,在需要时跳回到UIThread上。以下是我的建议:

public void onCreate(...)
{
    super.onCreate(...);
    myActivity.setContentView(R.layout.main);
    new Thread(this).start();
}

public void run()
{
    try
    {
        changeLayout(R.layout.main2);
        Thread.sleep(5000);
        changeLayout(R.layout.main3);
        Thread.sleep(10000)
        changeLayout(R.layout.main4);
    }catch(Exception e){}
}

public void changeLayout(int id)
{
    this.id = id;
    myActivity.post(new Runnable()
    {
        public void run()
        {
            myActivity.setContentView(id);
        }
    });
}

private int id;

当然,在这个示例中,类必须实现Runnable才能工作。只有UIThread可以访问UI,其他线程无法访问。这就是为什么您必须跳上跳下UIThread。希望这能奏效

我认为您正在阻止UI Thead。尝试使用静态处理程序对象。

我认为您正在阻止UI Thead。尝试静态处理程序对象。

在构造函数或init()函数中是否有该代码?如果是,只绘制第一张图片,Thread.sleep()函数将在调用构造函数或init()函数的位置之后移动。
然后调用repaint()函数或其他函数。

构造函数或init()函数中是否有该代码?如果是,只绘制第一张图片,Thread.sleep()函数将在调用构造函数或init()函数的位置之后移动。
然后调用repaint()函数或其他函数。

您的标记状态为“多线程”,但显示后台线程使用情况的多线程代码在哪里?你读过关于线程使用的教程吗?也许有一个绘画事件在等着你放开你正在睡觉的UI线程。你真的应该重新考虑你的方法。将主UI线程休眠1秒以便绘制新图片将导致设备在此期间无响应。用户将无法做任何事情(除了离开你的应用程序,他们可能会这样做,因为他们会认为你的应用程序正在“冻结”他们的设备)你的标记状态为“多线程”,但你的多线程代码在哪里显示后台线程的使用?你读过关于线程使用的教程吗?也许有一个绘画事件在等着你放开你正在睡觉的UI线程。你真的应该重新考虑你的方法。将主UI线程休眠1秒以便绘制新图片将导致设备在此期间无响应。用户将无法做任何事情(除了离开你的应用程序,他们可能会这样做,因为他们会认为你的应用程序正在“冻结”他们的设备)正确的概念,但过于复杂的代码。使用
ImageView
上的
postDelayed()
来计划延迟后在主应用程序线程上执行的
Runnable
。能否详细介绍如何使用ImageView上的postDelayed()来计划Runnable?我刚才试过了,布