gpt4 book ai didi

java - 在Android上通过OkHttp连接到websocket时如何捕获UnknownHostException?

转载 作者:行者123 更新时间:2023-12-01 06:05:19 29 4
gpt4 key购买 nike

当提供互联网连接时,我的应用程序能够使用 OkHttp(v 3.9.0)通过 websocket 连接到服务器。我想优雅地处理连接到 websocket 的失败尝试(即没有可用的互联网连接时)。

我使用下面提供的代码建立到我的服务器的连接:

Request request = new Request.Builder()
.url(BuildConfig.WS_URL)
.build();

client.newWebSocket(request, webSocketListener);

我的监听器处理失败并记录 UnknownHostException。

@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {

if(t instanceof UnknownHostException) {
Log.v("LISTENER", "UNKNOWN HOST EXCEPTION");
}
}

结果是

09-11 15:16:32.773 18384-18473/com.example.app V/LISTENER: UNKNOWN HOST EXCEPTION

09-11 15:16:32.775 18384-18473/com.example.app E/AndroidRuntime: FATAL EXCEPTION: OkHttp https://my.server.url/...
Process: com.example.app, PID: 18384

应用程序崩溃了。

我尝试用 try-catch 包围第一个代码块,捕获抛出的任何异常,但后来我发现 UnknownHostException 一定已经由 OkHttpClient 在内部处理了。 OkHttpClient 然后调用我的监听器的 onFailure 方法。然而,UnknownHostException 仍然未被捕获。有没有办法捕获这个异常?我不想使用 Thread.setDefaultUncaughtExceptionHandler() 。有没有其他方法可以处理这种情况?

最佳答案

大约一个月前,我尝试使用 Android 中的 OkHttp 与 WebSockets 服务器进行通信,但它不起作用。因此,我使用了一种低级的通信方式,并且只需使用基本的 Java,它就发挥了神奇的作用。

代码如下(在我的例子中用于将信息发送到服务器):

//this is the method that sends the String passed as the parameter to the Sockets server
private void sendMessage(final String stringToSend) throws IOException {

if(isOnline()){
new Thread(new Runnable() {
@Override
public void run() {

Socket socket = null;
try {
socket = new Socket("192.168.0.1",1001);
} catch (IOException e) {
e.printStackTrace();
}
DataOutputStream DOS = null;
try {
DOS = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
DOS.writeUTF(stringToSend);
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}

使用这种低级方法,我能够绕过 OkHttp,仅使用标准 Java 完成我的工作。现在,我知道您想要从服务器获取数据而不是发布数据,就像我的例子一样,但也许它会给您一个仅使用 Java 的解决方法的想法。

此外,您可以像我一样编写一个 isOnline() 方法。仅当它在线时才会尝试与服务器通信。也许这样,您就可以解决问题并保留当前的代码。这是我的 isOnline() 方法:

protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
//if you're not connected through Wi-Fi...
if(netInfo.getType() != ConnectivityManager.TYPE_WIFI){
Toast.makeText(this,"This app doesn't work without Wi-Fi",Toast.LENGTH_LONG).show();
return false;
}
return true;
} else {
return false;
}
}

您甚至可以使用以下命令让应用尝试连接到某个 Wi-Fi:

    private void connectToWifi() {
String networkSSID = "YourWiFiSSID";

WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + networkSSID + "\"";
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.addNetwork(wifiConfig);

//enable the WiFi if it's disabled
if (!wifiManager.isWifiEnabled()){
wifiManager.setWifiEnabled(true);
}

//get the list of Wi-Fi configurations
List<WifiConfiguration> wifiConfigurationList = wifiManager.getConfiguredNetworks();
for(WifiConfiguration configuration : wifiConfigurationList){
//if the configuration is the right one, connect to it
if(configuration.SSID != null && configuration.SSID.equals("\"" + networkSSID + "\"")){
wifiManager.disconnect();
wifiManager.enableNetwork(configuration.networkId,true);
// wifiManager.reconnect();

break;
}
}
}

关于java - 在Android上通过OkHttp连接到websocket时如何捕获UnknownHostException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46157408/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com