Java 如何从UI线程以外的线程显示对话框

Java 如何从UI线程以外的线程显示对话框,java,android,Java,Android,我的应用程序需要读取gps,因此在主线程上我启动了一个读取gps的线程,但我无法显示一个显示“请稍候”的对话框。我还使用了处理程序绑定,但这也不起作用。从第二个线程控制“请等待”对话框的最佳方法是什么?谢谢 public void showWaitDialog() { prgDialog = new ProgressDialog(context); prgDialog.setTitle("Please wait."); prgDialog.setMessage("Ple

我的应用程序需要读取gps,因此在主线程上我启动了一个读取gps的线程,但我无法显示一个显示“请稍候”的对话框。我还使用了处理程序绑定,但这也不起作用。从第二个线程控制“请等待”对话框的最佳方法是什么?谢谢

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使用它,但我的问题是如何将处理程序作为参数传递。谢谢!