4

我需要在声音结束时更改 ImageView ,但是当我尝试使用线程来使用它来冻结屏幕时,应用程序会关闭;

mp = MediaPlayer.create(this, R.raw.ave_maria);
    mp.start();
    im = (ImageView) findViewById(R.id.imag1);

    Thread thread = new Thread() {
        public void run() {

            while (mp.isPlaying()) {

            }
            im.setImageResource(R.drawable.primeiro_misterio_gozoso07);
        }
    };
    thread.start();
4

4 回答 4

4

在 mp 对象上使用 OnCompletionListener:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

            // SET THE BACKGROUND HERE
            }
        }); 
于 2012-11-23T16:10:38.620 回答
2

您应该将代码与线程 UI 同步。

mp = MediaPlayer.create(this, R.raw.ave_maria);
    mp.start();
    im = (ImageView) findViewById(R.id.imag1);

    Thread thread = new Thread() {
        public void run() {

            while (mp.isPlaying()) {

            }
            //YouActivity 
            YouActivity.this.runOnUiThread(new Runnable() {

            public void run() {
               im.setImageResource(R.drawable.primeiro_misterio_gozoso07);

            }
    });

        }
    };
    thread.start();
于 2012-11-23T16:09:25.693 回答
1

您不能从后台线程更改 UI。MediaPlayer 还提供了一个OnCompletionListener接口,您可能应该使用它而不是 while 循环。事实上,如果您使用 onCompletionListener,您甚至不必将其放在自己的线程上,因此您不必担心如何更改 UI。

像这样的东西应该可以正常工作:

mp.setOnCompletionListner(new OnCompletionListner() {
    public void onCompletion(MediaPlayer m){
        im.setImageResource(R.drawable.primeiro_misterio_gozoso07);
    }
});
于 2012-11-23T16:14:27.073 回答
0

您可以使用 AsyncTask,它是 Android 中一个非常有用的类,让您可以覆盖 3 种方法(onPreExecute、doInBackground 和 onPostExecute)。

您可以在声音播放期间使用 doInBackground 并使用 onPostExecute 设置图像。

更好的是,您可以使用 onPreExecute 来显示一些不错的东西,例如进度对话框或类似的东西。

对于 AsyncTask,请参见:http: //developer.android.com/reference/android/os/AsyncTask.html

于 2012-11-23T16:10:13.607 回答