HttpURLConnection 抛出异常[重复]

问题描述 投票:0回答:1

这是我的连接代码

HTTP

URL url = new URL("http://www.google.com");
              HttpURLConnection con = (HttpURLConnection) url.openConnection();
              con.setDoOutput(true);
              String responseMsg = con.getResponseMessage();
              int response = con.getResponseCode();

这是投掷

android.os.NetworkOnMainThreadException

请帮忙。

android httpurlconnection
1个回答
37
投票

android.os.NetworkOnMainThreadException 发生是因为您正在主 UI 线程上进行网络调用。而是使用异步任务。

asynctask 的文档。http://developer.android.com/reference/android/os/AsyncTask.html。

在 UI 线程中调用 AsyncTask。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new MyDownloadTask().execute();

}

class MyDownloadTask extends AsyncTask<Void,Void,Void>
{


    protected void onPreExecute() {
      //display progress dialog.
    
 }
    protected Long doInBackground(Void... params) {
          URL url = new URL("http://www.google.com");
          HttpURLConnection con = (HttpURLConnection) url.openConnection();
          con.setDoOutput(true);
          String responseMsg = con.getResponseMessage();
          int response = con.getResponseCode();
     return null;
 }



 protected void onPostExecute(VOid result) {
   // dismiss progress dialog and update ui
 }
}

注意:AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent pacakge 提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

2024 年 3 月 5 日更新:AsyncTask 已弃用 https://developer.android.com/reference/android/os/AsyncTask

使用协程代替上面的。上述建议已经过时了https://developer.android.com/kotlin/coroutines。 使用上下文切换和适当的调度程序。

也切换到使用 Okhttp3 和改造 https://square.github.io/okhttp/

© www.soinside.com 2019 - 2024. All rights reserved.