1

これは私が開発している単純な Android アプリです。ボタンをクリックするたびにサウンドを再生することを目的としています....ボタンをゆっくりクリックすると機能しますが、ボタンを速くクリックすると常にクラッシュします実行時エラーによるペース - NullPointerException! .....何が間違っているのかわかりません。

public class OSDC_Mini_ProjectActivity extends Activity implements MediaPlayer.OnCompletionListener {

private ImageButton play,pause,stop;
private MediaPlayer mp;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    play = (ImageButton)findViewById(R.id.play);
    pause = (ImageButton)findViewById(R.id.pause);
    stop = (ImageButton)findViewById(R.id.stop);

    play.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            play();
        }
    });

    pause.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            pause();
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            stop();
        }
    });

    setup();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (stop.isEnabled()) {
        mp.stop();
    }
}

public void onCompletion(MediaPlayer mp) {
    stop();
}

private void play() {
    mp.start();
    play.setEnabled(false);
    pause.setEnabled(true);
    stop.setEnabled(true);
}

private void stop() {
    mp.stop();
    pause.setEnabled(false);
    stop.setEnabled(false);

    try {
        mp.prepare();
        mp.seekTo(0);
        play.setEnabled(true);
    }
    catch (Throwable t) {
        error(t);
    }
}

private void pause() {
    mp.pause();
    play.setEnabled(true);
    pause.setEnabled(false);
    stop.setEnabled(true);
}

private void loadClip() {
    try {
        mp=MediaPlayer.create(this, R.raw.test);
        mp.setOnCompletionListener(this);
    }
    catch (Throwable t) {
        error(t);
    }
}

private void setup() {
    loadClip();
    play.setEnabled(true);
    pause.setEnabled(false);
    stop.setEnabled(false);
}

private void error(Throwable t) {
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder
        .setTitle("報錯啦!")
        .setMessage(t.toString())
        .setPositiveButton("確定", null)
        .show();
}
}
4

1 に答える 1

0

すべてのメソッドに null チェックを追加します。また、mp が現在何も再生していない場合にのみ、メディアの再生を開始します

于 2012-12-23T18:22:28.123 に答える