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は、whileループの代わりに使用する必要があるOnCompletionListenerインターフェイスを提供します。実際、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 に答える