正如標題所暗示的,我在檢查 android 與服務器的連接時遇到了問題。
我有一個專案離開了一個月,當時我用來檢查服務器連接的代碼是這個問題的答案,但是現在當我再次打開這個專案并嘗試運行它時,我似乎無法能夠到達服務器。
這是我檢查服務器連接的代碼:
public static boolean isServerConnected() {
try {
URL myUrl = new URL(URL_CONNECTION);
URLConnection connection = myUrl.openConnection();
connection.setConnectTimeout(10000);
connection.connect();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
這就是我所說的(在登錄按鈕中):
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Servers.isServerConnected()) {
username = edtUser.getText().toString();
password = edtPass.getText().toString();
login();
} else {
Toast.makeText(getApplicationContext(), "Server is not connected", Toast.LENGTH_SHORT).show();
}
}
});
這是我得到的例外:
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
W/System.err: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:333)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:113)
at com.android.okhttp.Connection.connectSocket(Connection.java:196)
at com.android.okhttp.Connection.connect(Connection.java:172)
at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
at com.itats.huwenakapp.koneksi.Servers.isServerConnected(Servers.java:38)
at com.itats.huwenakapp.Login$1.onClick(Login.java:74)
at android.view.View.performClick(View.java:5610)
at
com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View$PerformClick.run(View.java:22265)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
uj5u.com熱心網友回復:
你明白了 android.os.NetworkOnMainThreadException,這意味著你不能用你的主 UI 執行緒檢查這個。您可能必須創建一個新執行緒。
簡而言之,您可以像這樣檢查:
new Thread(new Runnable() {
public void run() {
Boolean connected = isServerConnected();
YourActivityName.this.runOnUiThread(new Runnable() {
public void run() {
if(connected){
Log.e("isConnected", connected " ");
//do your stuff
}
}
});
}
}).start();
// your found method
public static boolean isServerConnected() {
try {
URL myUrl = new URL(URL_CONNECTION);
URLConnection connection = myUrl.openConnection();
connection.setConnectTimeout(10000);
connection.connect();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
確保URL_CONNECTION格式正確
完整示例:
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
public void run() {
Boolean connected = isServerConnected();
YourActivityName.this.runOnUiThread(new Runnable() {
public void run() {
if (connected) {
Log.e("isConnected", connected " ");
//do your stuff
username = edtUser.getText().toString();
password = edtPass.getText().toString();
login();
} else {
Toast.makeText(getApplicationContext(), "Server is not connected", Toast.LENGTH_SHORT).show();
}
}
});
}
}).start();
}
});
uj5u.com熱心網友回復:
如例外日志中所述,當您在 android 的主執行緒/UI 執行緒上執行網路呼叫時,您會收到android.os.NetworkOnMainThreadException 。要解決此問題,您必須在后臺執行緒上執行呼叫。這可能包括使用AsyncTask(已棄用)或Coroutines(僅適用于 Kotlin)或RxJava或任何其他執行緒方式在后臺執行緒上運行呼叫。
您也可以查看此問題以獲取答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435795.html
下一篇:如何從字串值中獲取前兩個單詞
