2012-05-01 6 views
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(); 
    } 
} 

例外エラーが発生しますが、明らかにスレッド内のイメージを設定できないため、どこで設定する必要がありますか?

+0

あなたのlogcatを追加してください – thepoosh

答えて

0

harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);コードをUIスレッドに書き込むと、UIコードを非UIスレッドに書き込むことができないためです。

あなたはまだちょうど睡眠(1000)とsleep(utblas.getDuration());を変更テスト目的のために、エラーを取得している場合はそう単純

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

でのコードの行の上に置き換えます。

1

これは、すべてのandroid documentationに、例を用いて、詳細に説明されています

のAndroidは他の のスレッドからUIスレッドにアクセスするには、いくつかの方法を提供しています。あなたは既にそれらのいくつかに精通しているかもしれないが、ここで 包括的なリストは、次のとおりです。

  • Activity.runOnUiThread(Runnableを)(Runnableを)
  • View.postDelayed(Runnableを、長い)
  • View.post
  • ハンドラ

[...]

残念ながら、これらのクラスとメソッド可能性もトンあなたの コードをより複雑で読みにくくするために終了してください。頻繁な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(); 
    } 
} 
関連する問題