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 には、他のスレッドから UI スレッドにアクセスする方法がいくつか用意されています。あなたはすでにそれらのいくつかに精通しているかもしれませんが、ここに包括的なリストがあります:

  • Activity.runOnUiThread(実行可能)
  • View.post(実行可能)
  • View.postDelayed(実行可能、長い)
  • ハンドラ

[...]

残念ながら、これらのクラスとメソッドは、コードをより複雑にし、読みにくくする傾向もあります。頻繁な UI 更新を必要とする複雑な操作を実装すると、さらに悪化します。

この問題を解決するために、Android 1.5 以降のプラットフォームでは AsyncTask というユーティリティ クラスが提供されています。これにより、ユーザー インターフェースとの通信が必要な長時間実行タスクの作成が簡素化されます。

于 2012-05-01T08:07:18.997 に答える
0

harmonicaTecknad.setImageResource(R.drawable.harmonicatecknad1);UI コードを非 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()ますが、通常、ロジックにスリープを使用することは避けてください。ほとんどのクラスには、何かが起こったときにコールバックを取得する方法があります。たとえば、あなたの場合は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 に答える