无法在Thread中显示ProgressDialog

时间:2011-04-07 03:24:13

标签: android multithreading handler progressdialog

我试图让它发挥作用时,我已经看到了各种各样的失败。我有一个通过Activity启动的线程。线程需要创建/显示进度对话框并将其关闭。

当我试图直接显示ProgressDialog时,我收到一条错误,表示我的Looper没有准备好。我抬头看了一个Looper是一个实现它。但是,我不得不调用Looper.loop来显示进度对话框。在它显示之后,应用程序冻结在该点上,永远不会继续通过Looper.loop调用。

我无法让它工作,所以使用HandlerThread和Handler寻找一种全新的方式。我创建一个HandlerThread并启动它。我从线程中获取looper并使用它创建一个Handler。我的ProgressDialog或Toasts根本不会出现。

有更简单的方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:1)

不确定ProgressDialog,但据我所知,Android中所有与UI相关的内容都需要在UI Thread中更新。实际上有一个简单的辅助类来实现异步任务:http://developer.android.com/reference/android/os/AsyncTask.html

或者,您可以创建一个处理程序(可以在UI线程上)并使用它创建对话框:

Handler uiHandler;
//Activity onCreate
onCreate(...){
    uiHandler = new Handler();
}

// Somewhere in your other thread, 
uiHandler.postRunnable(new Runnable(){
    @Override
    public void run(){
       // Create or update dialog
       ...
    }
});

答案 1 :(得分:1)

你可以拥有

private Handler stopProgressHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {         
        setProgressBarIndeterminateVisibility(false);
    }
};
private Handler startProgressHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {         
        setProgressBarIndeterminateVisibility(true);
    }
};

这样当你开始线程时启动progressbar并在线程完成后你可以停止progressbar

 public void closeProgressbar(){
    //bluetoothconnector.onDestroy();
    stopProgressHandler.sendEmptyMessage(0);
 }
public void openProgressbar(){
    //bluetoothconnector.onDestroy();
    startProgressHandler.sendEmptyMessage(0);
 }

这将有助于调用progressbar启动和停止..这将是解决方案之一..

答案 2 :(得分:0)

最后的答案是错误的......

它应该是:

setProgressBarIndeterminateVisibility(Boolean.TRUE | Boolean.FALSE);