我希望在播放旋律时延迟我的应用程序一段时间,并在完成时更改图像视图上的图像。
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 :(得分:1)
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();
}
}