2016-07-26 11 views
3

私はAndroidスタジオを使用しています。私は、MainActivity.javaファイルで簡単なHTTPリクエストを試みるのに数時間を費やしていましたが、複数の方法で試してみました。それを理解することはできません。MainActivity.javaで簡単なHTTPリクエストを作成するにはどうすればよいですか? (Androidスタジオ)

私はOkHttpを試してみると、メインスレッドではできないというエラーが表示されます。今私は、このようにそれをやろうとしている:

public static String getUrlContent(String sUrl) throws Exception { 
    URL url = new URL(sUrl); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("GET"); 
    connection.setDoOutput(true); 
    connection.setConnectTimeout(5000); 
    connection.setReadTimeout(5000); 
    connection.connect(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    String content = "", line; 
    while ((line = rd.readLine()) != null) { 
     content += line + "\n"; 
    } 
    return content; 
} 

私はMainActivity.javaで直接そのメソッドを入れて、私のクリックイベントがMainActivity.javaでもある別の方法からそれを実行します。

try { 
    String str = getUrlContent("https://example.com/WAN_IP.php"); 
    displayMessage(str); 
} 
catch(Exception e){ 
    displayMessage(e.getMessage()); 
} 

しかし、今はクラッシュはなく、 "BufferedReader"を開始する行に例外がスローされることがわかりますが、e.getMessage()は空白です。

私はAndroidスタジオとJavaの新機能ですので、この非常に基本的な問題を親切にしてください。最終的に私はサーバーへの投稿要求を行う必要があり、OkHttpが最良の方法だと思われますが、私はAndroidスタジオのOkHttpの "Hello World"をオンラインで文書化していません。

答えて

8

メインスレッドでネットワーク要求を行うべきではありません。遅延は予測不可能であり、UIがフリーズする可能性があります。

Androidでは、メインスレッドのHttpUrlConnectionオブジェクトを使用すると例外がスローされます。

次に、バックグラウンドでネットワーク要求を行い、メインスレッドのUIを更新する必要があります。 AsyncTaskクラスは、このユースケースでは非常に便利です!

private class GetUrlContentTask extends AsyncTask<String, Integer, String> { 
    protected String doInBackground(String... urls) { 
     URL url = new URL(urls[0]); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     connection.setDoOutput(true); 
     connection.setConnectTimeout(5000); 
     connection.setReadTimeout(5000); 
     connection.connect(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String content = "", line; 
     while ((line = rd.readLine()) != null) { 
      content += line + "\n"; 
     } 
     return content; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 

    protected void onPostExecute(String result) { 
     // this is executed on the main thread after the process is over 
     // update your UI here 
     displayMessage(result); 
    } 
} 

そして、あなたはこのプロセスをこのように起動します。

new GetUrlContentTask().execute(sUrl) 
+0

OK、コードが最も役立ちましたが、いくつかの調整が必要でした。 Android Studioがデバッグを手助けしてくれました。 –

+2

訂正のために編集を提案してください:) –

0

this答えをご覧ください。メインスレッドでHTTP接続を開くことはできません(このため、この最初のエラーが発生します)AsyncTaskを使用するとよいでしょう。

+0

を試してみてくださいaysnc呼び出します。私は確かに良い答えを示していますが、私はコードをどうするべきか分かりません。私はどこに置くべきか分からない。 AsyncTaskのメインスレッドに追加する必要があるAsyncTaskのドキュメントが表示されていますが、その方法やその意味を理解できません。 –

0

あなたがokhttp使用している場合、私はあなたがAndroidのメーカーとJavaの私の知識を過大評価だと思う怒鳴るコード

private final OkHttpClient client = new OkHttpClient(); 

    public void run() throws Exception { 
    Request request = new Request.Builder() 
     .url("http://publicobject.com/helloworld.txt") 
     .build(); 
    client.setConnectTimeout(15, TimeUnit.SECONDS); 
    client.newCall(request).enqueue(new Callback() { 
     @Override public void onFailure(Call call, IOException e) { 
     e.printStackTrace(); 
     } 

     @Override public void onResponse(Call call, Response response) throws IOException { 
     if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

     Headers responseHeaders = response.headers(); 
     for (int i = 0, size = responseHeaders.size(); i < size; i++) { 
      Log.e(responseHeaders.name(i) , responseHeaders.value(i)); 
     } 

     Log.e("response",response.body().string()); 
     } 
    }); 
    } 
関連する問題