我正在创建一个简单的应用程序,它将流式传输互联网广播电台。因此,当用户点击播放按钮时,我想显示进度条(加载圆圈),直到播放流。
我有两个Runnables,一个用于显示进度条,另一个用于加载音频流和播放。这是一个进度条Runnable:
private Runnable showProgressBar = new Runnable() {
@Override
public void run() {
progBar.setVisibility(View.VISIBLE);
}
};
比按钮点击:
buttonPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Handler show_progress_h = new Handler();
show_progress_h.post(showProgressBar);
Handler play_h = new Handler();
play_h.post(startPlayingThread);
}
});
但是...进度条加载到很晚。无线电几乎装载时会加载,因此您只能看到它闪烁。单击按钮后是否可以立即显示?我不知道是什么减慢了它。我应该使用其他东西而不是Handler吗?
哦,顺便说一句......我也没有处理过两次,但反应是一样的。
答案 0 :(得分:1)
问题是,在显示进度条后,您将在UI线程上发布长时间运行的任务:
buttonPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Handler show_progress_h = new Handler();
show_progress_h.post(showProgressBar);
Handler play_h = new Handler();
play_h.post(startPlayingThread);//<< issue is here
}
});
而是做类似的事情:
buttonPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Handler show_progress_h = new Handler();
show_progress_h.post(showProgressBar);
new AsyncTask<Void, Void, Void>(){
@Override
protected void doInBackground(Void v){
// perform long runningtask here that you are performing in
//startPlayingThread
}
}.execute();
}
});
有关详细信息,请查看本教程:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html#concurrency_asynchtask
答案 1 :(得分:0)
您可以使用新的Thread(your_runnable).start()作为替代方案,并尝试调试它。