Java 如何从UI线程以外的线程显示对话框
我的应用程序需要读取gps,因此在主线程上我启动了一个读取gps的线程,但我无法显示一个显示“请稍候”的对话框。我还使用了处理程序绑定,但这也不起作用。从第二个线程控制“请等待”对话框的最佳方法是什么?谢谢Java 如何从UI线程以外的线程显示对话框,java,android,Java,Android,我的应用程序需要读取gps,因此在主线程上我启动了一个读取gps的线程,但我无法显示一个显示“请稍候”的对话框。我还使用了处理程序绑定,但这也不起作用。从第二个线程控制“请等待”对话框的最佳方法是什么?谢谢 public void showWaitDialog() { prgDialog = new ProgressDialog(context); prgDialog.setTitle("Please wait."); prgDialog.setMessage("Ple
public void showWaitDialog() {
prgDialog = new ProgressDialog(context);
prgDialog.setTitle("Please wait.");
prgDialog.setMessage("Please wait.");
prgDialog.setCancelable(false);
prgDialog.show();
}
为什么不使用
异步任务
。您可以告诉onPreExecute()
上的任务显示“请等待”对话框,然后onPostExecute(结果)
您可以删除该对话框。当doInBackground(Params…Params)
在后台线程中出现时,这两个方法在UI线程上工作
例如:
private class GetGPSTask extends AsyncTask<null, null, null>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
showWaitDialog(); <-Show your dialog
}
@Override
protected void doInBackground(null) {
//your code to get your GPS Data
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
HideDialogbox(); <-Code to hide the dialog box
}
}
私有类GetGPSTask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
showWaitDialog();为什么不使用一个AsyncTask
。您可以告诉onPreExecute()
上的任务显示请等待对话框,然后onPostExecute(Result Result)
您可以删除该对话框。这两个方法在doInBackground(Params…Params)时在UI线程上工作
正在后台线程中发生
例如:
private class GetGPSTask extends AsyncTask<null, null, null>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
showWaitDialog(); <-Show your dialog
}
@Override
protected void doInBackground(null) {
//your code to get your GPS Data
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
HideDialogbox(); <-Code to hide the dialog box
}
}
私有类GetGPSTask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
showWaitDialog();正如其他答案正确建议的那样,您最好使用。下面是一个如何使用它的示例:。否则您也可以使用runOnUiThread
方法。从第二个线程内部对UI线程进行更改(例如:对话和祝酒)。根据它的说明:
它在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将该操作发布到UI线程的事件队列。
对于eg
Your_Activity_Name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// your stuff to update the UI
showWaitDialog();
}
});
见和。
希望这有帮助。正如其他答案正确建议的那样,您最好使用。下面是一个如何使用它的示例:。否则,您也可以使用runOnUiThread
方法。从第二个线程内部对UI线程(例如:对话框和祝酒词)进行更改。根据its,它说:
它在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将该操作发布到UI线程的事件队列。
对于eg
Your_Activity_Name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// your stuff to update the UI
showWaitDialog();
}
});
见和。
希望这有帮助。您可以:
- 在UI线程中定义
处理程序
(例如在活动中
),然后将其传递给线程。现在从线程调用Handler.post(runnable)
,将要在UIThread上执行的代码排队
- 在您的
活动中定义一个广播接收器
,并从您的线程发送一个意图
,其中包含捆绑包中的必要信息
- 使用
AsyncTask
和方法publishProgress
()、onProgressUpdate()
或onPostExecute()
通知活动
进度或taask完成的时间
- 使用
runOnUiThread
这取决于您的需要。对于短期运行的异步操作,AsyncTask
是一个不错的选择。您可以:
- 在UI线程中定义
处理程序
(例如在活动中
),然后将其传递给线程。现在从线程调用Handler.post(runnable)
,将要在UIThread上执行的代码排队
- 在您的
活动中定义一个广播接收器
,并从您的线程发送一个意图
,其中包含捆绑包中的必要信息
- 使用
AsyncTask
和方法publishProgress
()、onProgressUpdate()
或onPostExecute()
通知活动
进度或taask完成的时间
- 使用
runOnUiThread
这取决于您的需要。对于短期运行的异步操作,AsyncTask
是一个不错的选择。Hi我试图将处理程序的更改Thread=new myClass();
传递到Thread=new myClass(处理程序);
然后在run()方法上接收它,将其更改为run(处理程序)
但这不起作用,正确的方法是什么?谢谢你调用了handler.post(runnable)?如果帖子仍然不起作用,您可以编辑帖子并用代码进行更新。是的,我做了,它起作用了,但我没有传递处理程序,我只是在Activity类上公开了它,然后从Thread类调用它Activity.handler使用它,但我的问题是如何将处理程序作为参数传递。谢谢!嗨,我试图传递处理程序Thread=new myClass();
到Thread=new myClass(handler);
然后在run()方法上接收它,将其更改为run(handler handler);
但这不起作用,正确的方法是什么?谢谢你调用handler.post(runnable)?如果帖子仍然不起作用,您可以编辑帖子并用代码进行更新。是的,我做了,它起作用了,但我没有传递处理程序,我只是在Activity类上公开了它,然后从Thread类调用它Activity.handler使用它,但我的问题是如何将处理程序作为参数传递。谢谢!