2017-09-11 51 views
0

インターネット接続が提供されると、私のアプリはOkHttp(v 3.9.0)を使ってwebsocket経由でサーバーに接続できます。正常にWebSocketに接続しようとして失敗した場合(つまり、インターネットに接続できない場合)を処理したい。AndroidでOkHttp経由でwebsocketに接続するとUnknownHostExceptionを捕まえる方法は?

私は以下の通りコードを使用して、私のサーバーへの接続を構築:

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()を使いたくありません。この状況に対処する他の方法はありますか?

+0

あなたがRet​​rofit2代わりのOkHttpを使用しようとしないのはなぜ?通常、RetrofitはAndroidで動作し、OkHttpは「Standard Java」で使用されます。 –

+0

UnknownHostExceptionがonFailure()メソッドの内部でスローされることはありません。 – canihazurcode

答えて

-1

UnknownHostExceptionがでますので、IOExceptionがキャッチすることができ、これは私が月ほど前のWebSocketサーバーと通信するには、AndroidからOkHttp使用してみました、そしてそれはdidnのあなた

+0

try {...} catch(Exception e){...}との接続を担当するコードブロックを囲んでみましたが、例外をスローしません – canihazurcode

+0

catch(IOException e) –

+1

IOExceptionはサブクラスです例外の – canihazurcode

1

のためにそれを修正しますIOExceptionのサブクラスであります働きたくありません。だから代わりに、私は低レベルのコミュニケーション方法を使いました。それは基本的な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; 
      } 
     } 
    } 
関連する問題