我试图让它发挥作用时,我已经看到了各种各样的失败。我有一个通过Activity启动的线程。线程需要创建/显示进度对话框并将其关闭。
当我试图直接显示ProgressDialog时,我收到一条错误,表示我的Looper没有准备好。我抬头看了一个Looper是一个实现它。但是,我不得不调用Looper.loop来显示进度对话框。在它显示之后,应用程序冻结在该点上,永远不会继续通过Looper.loop调用。
我无法让它工作,所以使用HandlerThread和Handler寻找一种全新的方式。我创建一个HandlerThread并启动它。我从线程中获取looper并使用它创建一个Handler。我的ProgressDialog或Toasts根本不会出现。
有更简单的方法可以做到这一点吗?
答案 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);