2017-11-02 23 views
2

私はGitHubアカウントからリポジトリ情報を取得するためにAndroidアプリを作成しています。 GitHubアカウントhttps://github.com/vGrynishynからリポジトリデータを取得する機能。 Androidスタジオを使用して結果が2〜3回しか受信されなかった場合、urlConnection.getResponseCode()android.os.NetworkOnMainThreadExceptionに次の例外が表示されます。 しかし、私はIntelij IDEA(コマンドラインアプリ)で実行しようとしましたが、問題なくいつでも動作しています。AndroidスタジオGitHub APIリクエストからの返品

どこにエラーがありますか教えてください。

private String getGitHubRepositoryContent(){ 
      String line = null; 
      try { 
       URL url = new URL("https://api.github.com/users/vGrynishyn/repos"); 

       HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
       int responseCode = urlConnection.getResponseCode(); 

       InputStream in; 
       if (urlConnection.getResponseCode() < HttpsURLConnection.HTTP_BAD_REQUEST) { 
        in = urlConnection.getInputStream(); 
       } else { 
        in = urlConnection.getErrorStream(); 
       } 

       BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 
       while (br.read() != -1) { 
        line = br.readLine(); 
       } 

       System.out.println("Response code: " + responseCode); 
       System.out.println(line); 

      } catch (Exception e) { 
       e.printStackTrace(); //do something 
      } 
      return line; 
    } 

debug window screen

答えて

1

エラーは、メインスレッドでのネットワーク操作を実行している示唆しています。 Android OSでは、UIがフリーズしないようにするため、あなたはそれを許可していません。別のスレッドでネットワーク操作を実行する、RetrofitライブラリまたはAsyntasksを使用してネットワーク操作を行う

+0

ありがとうございます!それはasynctaskにあったが、私はそれを単純な関数に移した。私はなぜO_oを知りません – VovaG

+0

あなたは歓迎です、私の答えをマークすることを忘れないでください:) –

1

ここでの問題は、メインスレッドでgetGitHubRepositoryContent()メソッドを実行していることです。これはAndroidでネットワークリクエストを行う正しい方法ではありません。また、HttpsURLConnectionを使用しないことをお勧めします。バックグラウンドスレッドでネットワークコールを処理し、メインスレッドでHTTP応答のコールバックを行うため、HTTP要求を行う場合はRetrofitまたはVolleyを使用します。

しかし、私はIntelij IDEA(コマンドラインアプリ)で実行しようとしましたが、問題なく常時動作しています。

これは、処理する個別のUIイベントがないため、コマンドラインでエラーなく実行されます。コマンドラインでリクエストが行われたときに、コードが実行中の同じスレッド上でリクエストを行い、プログラムがフリーズしますが、目立たないのは、別のUIがないために表示されます( )。

TL; DRあなたはAndroidのメインスレッドでネットワークリクエストを行うべきではありません。 RetrofitまたはVolleyを使用することをお勧めします。

関連する問題