我正在创建一个简单的应用程序,它将流式传输互联网广播电台。因此,当用户点击播放按钮时,我想显示一个进度条(加载圆圈),直到播放流。
我有两个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吗?
哦,顺便说一句…我也在没有处理程序的情况下尝试了这两种方法,但结果是一样的。
问题是在显示progressbar:后,您立即在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
您可以使用new Thread(your_runnable).start()作为替代方案,并尝试调试它。