0

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

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

我得到一个异常错误,显然我无法在线程内设置图像,那么我应该在哪里设置呢?

4

3 回答 3

1

这一切都在android 文档中通过示例进行了详细解释:

Android 提供了几种从其他线程访问 UI 线程的方法。您可能已经熟悉其中的一些,但这里有一个完整的列表:

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

[...]

不幸的是,这些类和方法也可能使您的代码更复杂,更难阅读。当您实施需要频繁更新 UI 的复杂操作时,情况会变得更糟。

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

于 2012-05-01T08:07:18.997 回答
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);

于 2012-05-01T08:40:36.253 回答
0

正如其他答案所说,您需要从 UI 线程设置图像。但是,虽然您可以使用Thread.sleep(),但通常应避免将 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();
    }
}
于 2012-05-01T09:16:12.613 回答