2012-05-01 20 views
0

我想在播放旋律的同时延迟我的应用程序一段时间,并在完成时更改imageview上的图像。使用睡眠功能时获取错误异常

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(); 
    } 
} 

我得到一个异常错误,很明显,我不能设置线程内的图像,所以我应该在哪里设置呢?

+0

请添加您的logcat – thepoosh

回答

0

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

所以,简单地用

runOnUiThread(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
      harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1); 
    } 
}); 

替换上面的代码行如果您仍然收到错误,然后进行测试的目的只是改变sleep(utblas.getDuration());睡眠(1000);

1

这在所有细节解释,结合实例,在android documentation

Android提供了几种方法来从其他 线程访问UI线程。你可能已经熟悉了他们中的一些,但这里是一个 全面的列表:

  • Activity.runOnUiThread(Runnable接口)
  • View.post(Runnable接口)
  • View.postDelayed(Runnable接口,长)
  • 处理器

[...]

不幸的是,这些类和方法也牛逼结束让你的 代码更复杂,更难以阅读。当你的实施复杂的操作需要频繁更新UI 时,它甚至变得更糟糕。

为了解决这个问题,Android的1.5和更高版本的平台提供了一个名为的AsyncTask 实用工具类,它简化了需要与用户接口通信 长时间运行的任务的创建。

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(); 
    } 
}