Android UI非常慢

时间:2013-12-01 14:59:02

标签: android performance user-interface

我正在创建一个简单的应用程序,它将流式传输互联网广播电台。因此,当用户点击播放按钮时,我想显示进度条(加载圆圈),直到播放流。

我有两个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吗?

哦,顺便说一句......我也没有处理过两次,但反应是一样的。

2 个答案:

答案 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()作为替代方案,并尝试调试它。