私のアプリには、音楽アイテムの ListView があり、アイテムをクリックすると、それに対応する mp3 URL をフェッチして、MediaPlayer でストリーミングします。ユーザーが [再生] ボタンをクリックするたびに、MediaPlayer のデータソースなどを設定します。問題は、[再生] ボタンをクリックして ListView をスクロールすると、画面がフリーズしてダイアログが開くことです。
AppName is not responding.
Would you like to close it?
Wait OK
しかし、スタックトレースを取得できませんでしたが、次のように言いました:
ANR my.package.name.AppName ...
Reason: keyDispatchingTimedOut
UIスレッドを待機させないように、プロセスをバックグラウンドスレッド内に配置することを読みました。これは私の現在の実装ですが、問題はまだ解決していません:
Thread t = new Thread() {
public void run() {
SampleActivity.this.runOnUiThread(new Runnable() {
public void run() {
try {
mp.reset();
mp.setDataSource(musicURI);
mp.prepare();
mp.start();
songSeekBar.setEnabled(true);
// Changing Button Image to stop image
btnPlay.setImageResource(R.drawable.btn_stop);
// set Progress bar values
songSeekBar.setProgress(0);
songSeekBar.setMax(100);
// Updating progress bar
updateProgressBar();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
songSeekBar.setEnabled(false);
songTotalDurationLabel.setText("0:00");
songCurrentDurationLabel.setText("0:00");
Log.d(Constant.TAG_SAMPLE, musicTitle
+ " mp3 file not found.");
e.printStackTrace();
}
}
});
}
};
t.start();
私がしたことは、runOnUiThread
内部に配置しThread
(機能していません)、試したThread
だけで(機能していません)、Asynctask
その内部にも試しましdoInBackground
たが、プレーヤーはバックグラウンドで再生されており、停止できませんが、内部に配置しようとはしていませんonPostExecute
何かが足りない気がします。1つ確かなことは、実際にはバックグラウンドスレッド内に配置する必要があるということですが、どのスレッドですか? どんなアイデアでも受け入れられます、ありがとう!
編集: だから、私は実装を変更しましたが、それはまだ持続しています:
Thread thread = new Thread() {
public void run() {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run() {
// Play song
try {
mp.reset();
mp.setDataSource(globalSongIndex);
mp.prepare();
mp.start();
songSeekBar.setEnabled(true);
// Changing Button Image to pause image
btnPlay.setImageResource(R.drawable.btn_stop);
// set Progress bar values
songSeekBar.setProgress(0);
songSeekBar.setMax(100);
// Updating progress bar
updateProgressBar();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
songSeekBar.setEnabled(false);
songTotalDurationLabel.setText("0:00");
songCurrentDurationLabel.setText("0:00");
Log.d(Constant.TAG_MYPAGE, musicTitle + " mp3 file not found.");
e.printStackTrace();
}
}
});
}
};
thread.start();
ちなみに、私はそれをアンドロイドのウェブサイトhereに基づいていました。