仅在线程终止后才显示进度对话框

时间:2021-07-10 17:30:43

标签: java android multithreading progressdialog ui-thread

我正在尝试在我的应用程序打开时连接到线程中的 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];

}

我在 startConnection 方法中调用 onStart()

protected void onStart() {

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

}
   

如何才能在线程实际开始之前显示进度对话框?

1 个答案:

答案 0 :(得分:0)

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

另外你不能调用progressDialog.dismiss();在 t 线程上,所有与 UI 交互的代码都必须在主线程上调用,您可以尝试使用 runOnUIThread() 活动方法