2011-10-19 23 views
1

我正试图完成一些非常简单的事情。首先,加载我的布局(main.xml)。然后等待1秒钟,修改图像,等待1秒钟并将其修改为第三张图像。 (当然,我的最终目标更复杂,但我甚至无法完成这项工作)。如何在java中以我想要的方式获得等待/睡眠状态?

基本上,我在应用程序加载时出现黑屏。它保持这种状态直到所有等待结束,然后显示最终图像。这里是我的代码:

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专家,所以我假设我正在做一些愚蠢的事情......

感谢您的帮助!

+0

您的标记指出“多线程”,但您的多线程代码显示使用后台线程的位置在哪里?你读过关于使用线程的教程吗? –

+0

也许有一个绘画事件等着你放开你正在睡觉的UI线程。 –

+2

你应该真的重新考虑你的方法。将主UI线程搁置1秒钟,以便您可以绘制新图片,这会导致设备在此期间无响应。用户将无法做任何事情(除了留下你的应用程序,他们可能会这样做,因为他们会认为你的应用程序“冻结”了他们的设备) – FoamyGuy

回答

0

尝试添加ImageCard [0] .invalidate(),当你想绘制。

0

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

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

2

好的继承人你的问题,当你在UIThread时,你永远不能睡觉(...)。 UIThread永远不会被锁定,它会导致很多非常糟糕的事情发生在Android中。但是有一个非常简单的方法,只需在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。希望这工作!

+1

正确的概念,但过于复杂的代码。使用'ImageView'上的'postDelayed()'来安排在运行延迟之后在主应用程序线程上执行'Runnable'。 – CommonsWare

+0

这也可以工作 – John

+0

您可以扩展您在ImageView上如何使用postDelayed()来安排Runnable吗?我刚刚尝试过,但不起作用。 – user1003910

3

我想你是封锁UI Thead。在静态处理程序对象上尝试Handler.postDelayed

+3

你甚至不需要'处理程序'。 'postDelayed()'可以在任何View上使用,例如'ImageView'。 – CommonsWare

+0

不知道,学习永不停止。 –

0

你有构造函数或init()函数中的代码吗?如果是的话,只画第一张图片,Thread.sleep()函数在构造函数或init()函数被调用的位置之后移动。 然后调用repaint()函数或其他东西。