【问题标题】:Progress Dialog is shown only after Thread terminates仅在线程终止后显示进度对话框
【发布时间】:2021-07-10 17:30:43
【问题描述】:

我正在尝试在打开我的应用程序时连接到线程中的 TCP/IP 套接字,并希望在连接时显示一个进度对话框。问题是线程总是在显示进度对话框之前执行,这意味着它仅在套接字连接实际发生(或失败)后才显示。

public static boolean startConnection (Context c) {

    boolean[] ret = new boolean[1];

    ProgressDialog progressDialog = new ProgressDialog(c);
    progressDialog.setMessage("Connecting...");
    progressDialog.show();

    Thread t = new Thread() {
        @Override
        public void run() {
            try {
                clientSocket = new Socket();
                clientSocket.connect(new InetSocketAddress(SERVER_IP, SERVER_PORT), 5000);
                ret[0] = true;
            }
            catch (IOException e) {
                e.printStackTrace();
                ret[0] = false;
            }
            ((Activity)c).runOnUiThread(progressDialog::dismiss);
        }
    };

    t.start();
    try {
        t.join();
    } 
    catch (InterruptedException e) {
        e.printStackTrace();
    }

    return ret[0];

}

我正在onStart() 方法中调用startConnection

protected void onStart() {

    super.onStart();
    if (ConnectionHandler.startConnection(this)) {
        goToMainActivity();
    }
    else {
        Toast.makeText(this, "Connection error.", Toast.LENGTH_LONG).show();
    }

}
   

我怎样才能使进度对话框在线程实际启动之前显示

【问题讨论】:

    标签: java android multithreading progressdialog ui-thread


    【解决方案1】:

    t.join(); 在 UI 主线程上等待,直到第二个线程 t 完成,这就是您的代码阻塞 UI 线程并且对话框不出现的原因。

    另外你不能打电话给progressDialog.dismiss();在t线程上,所有与UI交互的代码都必须在主线程上调用,可以尝试tom调用runOnUIThread()activity方法

    【讨论】:

    • 不幸的是我必须调用t.join() 否则我不能等待线程设置我需要返回的布尔值。我实际上尝试使用runOnUIThread(),但问题仍未解决,线程在显示进度对话框之前启动,并且加入调用强制 UI 线程等待。我将编辑问题中的代码。
    • 这可以通过其他不阻塞 UI 的方式来完成,例如使用 ExecutorService 并传递一个在作业完成时调用的侦听器。 UI 线程不应该被阻塞,这会冻结你的应用并且给用户带来不好的体验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多