-2

私はAndroidとJavaが初めてです。そして、UDACITYからAndroidアプリ開発を学ぼうとしています。このコードを実行しようとしていて、SocketTimeOutExcepetion を期待していますが、取得しているのは UnknownHostException です。

try {
    final String BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?";
    final String ZIP = "zip";
    final String MODE = "mode";
    final String UNITS = "units";
    final String COUNT = "cnt";
    final String APP_ID = "appid";

    Uri builtUri = Uri.parse(BASE_URL).buildUpon()
                      .appendQueryParameter(ZIP, params[0] + ",in")
                      .appendQueryParameter(MODE,format)
                      .appendQueryParameter(UNITS, units)
                      .appendQueryParameter(COUNT, Integer.toString(numDays))
                      .appendQueryParameter(APP_ID, BuildConfig.OPEN_WEATHER_MAP_API_KEY)
                      .build();
    String str = java.net.URLDecoder.decode(builtUri.toString());
    URL url = new URL(str);

    urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(5000);
    urlConnection.connect();

    InputStream inputStream = urlConnection.getInputStream();
    StringBuffer buffer = new StringBuffer();

    if (inputStream == null) {
        return null;
    }

    reader = new BufferedReader(new InputStreamReader(inputStream));

    String line;

    while ((line = reader.readLine()) != null)
        buffer.append(line + "/n");

    if (buffer.length() == 0)
        return null;

    forecastJsonStr = buffer.toString();

    Log.v(LOG_TAG,"JSON forcast string:" +forecastJsonStr);
}catch(SocketTimeoutException e) {
    startActivity(new Intent(getActivity(),CheckNet.class));
} catch (IOException e) {
    Log.e("FetchWeatherTask", "Error:" + e.toString());
    return null;
}

Android バージョン 4.0.4 を実行している携帯電話でテストしました。テスト中は、モバイルデータと Wi-Fi をオフにしました

4

2 に答える 2

3

モバイル データと Wi-Fi がオフになっていると、ソケット レイヤーはインターネット アドレス (「openweathermap.org」など) を IP アドレスに解決できません。これが、UnknownHostException を取得する理由です。

一方、ネットワーク上にあり、IP アドレスを解決でき、サーバーが応答しない場合は、SocketTimeoutException が発生します。

于 2016-02-06T21:06:33.123 に答える
0

例外をシミュレートする場合は、次のようにします。

  1. データを切断して Wi-Fi に接続する
  2. Wi-Fi 接続の設定を編集する
  3. 静的 IP に変更し、IP に 169.254.0.50、サブネットに 255.255.0.0、ゲートウェイに 169.254.0.1 を入力します。
  4. BASE_URL = "192.241.169.168/data/2.5/forecast/daily?" を変更します。
  5. アプリを実行する
于 2016-02-06T21:22:59.687 に答える