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