web-dev-qa-db-ja.com

MainActivity.javaで簡単なHTTPリクエストを作成するにはどうすればよいですか? (Android Studio)

私はAndroid Studioを使用しており、MainActivity.Javaファイルで単純なHTTPリクエストを実行するために数時間を費やし、複数の方法を試し、多くのWebページを件名、まだそれを理解することはできません。

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 StudioとJavaを初めて使用するので、親切にしてこの非常に基本的な問題を手伝ってください。最終的にはサーバーへの投稿リクエストを行う必要があります。OkHttp行くのが最善の方法ですが、Android Studioでオンラインでドキュメント化されているStudioにOkHttpの「Hello World」が見つかりません。

6
Brian Gottier

メインスレッドでネットワークリクエストを作成しないでください。遅延は予測不可能であり、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)
19
Nicolas Dusart

this の答えを見てください。メインスレッドでHTTP接続を開くことはできません(これがこの最初のエラーが発生した理由です)。AsyncTaskを使用すると、これに対処できます

0
Agata Cieplik

okhttpを使用している場合は、非同期呼び出しを実行してコードを試してください

 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());
      }
    });
  }
0
Chayon Ahmed