我正在尝试在我的应用程序打开时连接到线程中的 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();
}
}
如何才能在线程实际开始之前显示进度对话框?
答案 0 :(得分:0)
t.join();
在 UI 主线程上等待,直到第二个线程 t 完成,这就是您的代码阻塞 UI 线程并且对话框没有出现的原因。
另外你不能调用progressDialog.dismiss()
;在 t 线程上,所有与 UI 交互的代码都必须在主线程上调用,您可以尝试使用 runOnUIThread()
活动方法