2016-07-26 2 views
3

Я использую Android Studio, и я потратил несколько часов, пытаясь сделать простой HTTP-запрос в моем файле MainActivity.java, и попробовал несколько способов и видел много веб-страниц по этому вопросу не может понять это.Как я могу сделать простой HTTP-запрос в MainActivity.java? (Android Studio)

Когда я пытаюсь 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 - лучший способ, но я не нахожу «Hello World» OkHttp в Android Studio, где-то в Интернете.

ответ

8

Вы не должны делать сетевые запросы в основном потоке. Задержка непредсказуема и может заморозить пользовательский интерфейс.

Android заставил это поведение выбросить исключение, если вы используете объект HttpUrlConnection из основного потока.

Затем вы должны выполнить сетевой запрос в фоновом режиме, а затем обновить пользовательский интерфейс в основном потоке. Класс 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

ОК, ваш код был наиболее полезным, но для этого потребовалась некоторая настройка. Android Studio помогла отладить, и она работает! –

+2

Пожалуйста, предложите отредактировать для исправления :) –

0

Посмотрите на this ответ. Невозможно открыть HTTP-соединение в основном потоке (и именно поэтому вы получили эту первую ошибку), и использование AsyncTask - хороший способ справиться с этим

+0

Я думаю, вы переоцениваете мои знания Android Studio и Java. Ссылка, на которую я уверен, показывает хороший ответ, но я не знаю, что делать с кодом. Я не знаю, куда его поместить. В документах для AsyncTask я вижу, что он должен быть добавлен в основной поток, но я не знаю, как это сделать или что это значит. –

0

, если вы используете 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()); 
     } 
    }); 
    }