2016-04-25 18 views
0

AndroidプロジェクトのURLからjsonファイルを読み込もうとしています。しかし、奇妙な状況が発生します。 StringBuilderは最初の数文字を正常に取得しましたが、java.net.SocketExceptionが発生しました:recvfromが失敗しました:EBADF(不正なファイル記述子)java.net.SocketException:recvfromが失敗しました:EBADF(不正なファイル記述子)Android

なぜこの例外が発生しますか?あなたはそれから読み取る前に、接続を切断している

public JSONArray getJSONFromUrl(String urlAsString) { 
     // try to create JSONObject from string 
     try { 
      URL url = new URL(urlAsString); 
      new DownloadFileTask().execute(url).get(); 
      jObj = new JSONArray(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return jObj; 
    } 

    private class DownloadFileTask extends AsyncTask<URL, Integer, Long> { 
     StringBuilder sb; 
     protected Long doInBackground(URL... urls) { 
      HttpURLConnection connection = null; 
      try { 
       connection = (HttpURLConnection) urls[0].openConnection(); 
       is = new BufferedInputStream(connection.getInputStream()); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      finally { 
       connection.disconnect(); 
      } 

      //file reading 
      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8); 
       sb = new StringBuilder(); 
       int symbol; 
       int counter = 0; 
       while ((symbol = reader.read()) != -1) { //PROBLEM HERE 
        sb.append((char)symbol); //OR HERE 
       } 
       json = sb.toString(); 
       is.close(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); //java.net.SocketException: recvfrom failed: EBADF (Bad file descriptor) 
      } 
      return null; 
     } 
    } 
+0

'connection.disconnect();'。それを取り除く。接続が切断されている場合は、今行っているようにもう読むことができません。 – greenapps

+0

'新しいDownloadFileTask()。execute(url).get();'。 .get()メソッドを呼び出すプログラミングが非常に悪いget()を削除し、次の文をonPostExecuteに配置します。 – greenapps

答えて

関連する問題