在我的应用程序中,我有一个音乐项目的 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
我有一种感觉,我错过了一些东西。有一件事是肯定的,我真的应该把它放在后台线程中,但是哪一个呢?任何想法都可以接受,谢谢!
编辑: 所以,我改变了我的实现,但它仍然存在:
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();
顺便说一句,我基于这里的 android 网站。