使用sleep函数时获取错误异常

时间:2012-05-01 07:56:30

标签: java android

我希望在播放旋律时延迟我的应用程序一段时间,并在完成时更改图像视图上的图像。

public void addListenerOnButtons() {    
    harmonicaTecknad= (ImageView)this.findViewById(R.id.harmonicatecknadspelautblas);
    harmonicaTecknad.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {            
        harmonicaTecknad.setImageResource(R.drawable.harmonicatecknadtryckrood);
        RunAnimations();
        utblas=MediaPlayer.create(SpelaTonerActivity.this, R.raw.utblas4);
        utblas.start();
        Thread timer = new Thread(){
            public void run() {
                try { // The delay should occur here
                    sleep(utblas.getDuration());
                } catch(InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);
                }
            }
        };
        timer.start();
    }
}

我收到异常错误,显然我无法在线程中设置图像,所以我应该在哪里设置它?

3 个答案:

答案 0 :(得分:1)

这些都在android documentation

中详细解释了示例
  

Android提供了几种从其他方式访问UI线程的方法   线程。你可能已经熟悉了其中一些,但这里有一个   综合清单:

     
      
  • Activity.runOnUiThread(可运行)
  •   
  • View.post(可运行)
  •   
  • View.postDelayed(Runnable,long)
  •   
  • 处理程序
  •   
     

[...]

     

不幸的是,这些类和方法也可能会使你的   代码更复杂,更难阅读。它变得均匀   当您的工具需要频繁的UI的复杂操作时更糟糕   更新。

     

要解决此问题,Android 1.5及更高版本平台提供了一个   名为AsyncTask的实用程序类,简化了创建   需要与用户界面通信的长时间运行的任务。

答案 1 :(得分:0)

在UI线程上编写harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);代码,因为您无法将UI代码写入非UI线程。

所以只需用

替换上面的代码行
runOnUiThread(new Runnable()
{
    @Override
    public void run()
    { 
            harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);
    }
}); 

如果您仍然收到错误,那么出于测试目的,只需将sleep(utblas.getDuration());更改为sleep(1000);

答案 2 :(得分:0)

正如其他答案所说,您需要从UI线程设置图像。但是,虽然您可以使用Thread.sleep(),但通常应避免将睡眠用于逻辑。大多数类都有一些方法可以在事情发生时获得回调 - 例如,在您的情况下,您可以使用MediaPlayer.OnCompletionListener。您注册了来自媒体播放器的回调,并且该回调将始终位于UI线程上。这就是它的样子:

public void addListenerOnButtons() {    
    harmonicaTecknad= (ImageView)this.findViewById(R.id.harmonicatecknadspelautblas);
    harmonicaTecknad.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {            
      harmonicaTecknad.setImageResource(R.drawable.harmonicatecknadtryckrood);
      RunAnimations();
      utblas=MediaPlayer.create(SpelaTonerActivity.this, R.raw.utblas4);
      utblas.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
          @Override
          public void onCompletion(MediaPlayer mp) {
              harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);
          }
      };
      utblas.start();
    }
}