如何在 MainActivity.java 中发出简单的 HTTP 请求? (安卓工作室)

Posted

技术标签:

【中文标题】如何在 MainActivity.java 中发出简单的 HTTP 请求? (安卓工作室)【英文标题】:How can I make a simple HTTP request in MainActivity.java? (Android Studio) 【发布时间】:2016-11-30 07:23:20 【问题描述】:

我正在使用 android Studio,我花了几个小时尝试在我的 MainActivity.java 文件中执行一个简单的 HTTP 请求,并尝试了多种方法,并且看到了许多关于该主题的网页,但无法弄清楚出去。

当我尝试 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 中找到在线任何地方记录的 OkHttp 的“Hello World”。

【问题讨论】:

看看this的回答。无法在主线程中打开 HTTP 连接(这就是您遇到第一个错误的原因),使用 AsyncTask 是处理此问题的好方法 我觉得你高估了我对 Android Studio 和 java 的了解。我确定该链接显示了一个很好的答案,但我不知道如何处理代码。我不知道该放在哪里。我在 AsyncTask 的文档中看到它应该被添加到主线程,但我不知道该怎么做,或者这意味着什么。 相关:***.com/q/46177133/8583692 【参考方案1】:

您不应该在主线程上发出网络请求。延迟是不可预测的,它可能会冻结 UI。

如果您使用主线程中的HttpUrlConnection 对象,Android 会通过引发异常来强制执行此行为。

然后您应该在后台发出网络请求,然后在主线程上更新 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)

【讨论】:

好的,您的代码很有帮助,但确实需要一些调整。 Android Studio 帮助调试,并且成功了!【参考方案2】:

如果你使用 okhttp 然后调用 aysnc 试试下面的代码

 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());
      
    );
  

【讨论】:

【参考方案3】:

您可以使用依赖项来发出 HTTP 请求或 HTTPS 请求,使用 OkHttp

访问:https://square.github.io/okhttp

 OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException 
  Request request = new Request.Builder()
      .url(url)
      .build();

  try (Response response = client.newCall(request).execute()) 
    return response.body().string();
  

【讨论】:

以上是关于如何在 MainActivity.java 中发出简单的 HTTP 请求? (安卓工作室)的主要内容,如果未能解决你的问题,请参考以下文章

如何将片段活动添加到 MainActivity.java 或 MainActivity.kt

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

如何在 Android 中扩展 Button 类?

错误形式(在 com.going.books.MainActivity.onCreate(MainActivity.java:19))

反应本机 - MainActivity.java

在 MainActivity.java 中检测在 Detox 上下文下运行的 Android React Native 应用程序