HttpURLConnection的抛出异常[复制](HttpURLConnection is th

2019-07-21 23:04发布

这个问题已经在这里有一个答案:

  • 如何解决android.os.NetworkOnMainThreadException? 53个回答

这里是我的代码来连接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

请帮忙。

Answer 1:

android.os.NetworkOnMainThreadException是因为你在你的主UI线程进行网络呼叫。 相反,使用的AsyncTask。

的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的设计是围绕线程和处理程序一个辅助类,并不构成通用线程框架。 AsyncTasks应该理想地(最多几秒钟。)可用于短期操作。如果您需要保持对长时间运行的线程,强烈建议您使用介绍java.util.concurrent pacakge如提供的各种API遗嘱执行人,并ThreadPoolExecutor的FutureTask。

另一种在robospice的AsyncTask。 https://github.com/octo-online/robospice 。

一些robospice的特点。

1.executes异步(在后台AndroidService)网络请求(例如:使用Spring的Android REST请求)。

2.is强类型! 你让使用的POJO你的要求,你会得到的POJO作为请求的结果。

3.enforce既不用于请求的POJO也没有对你在项目中使用活动课,没有任何限制。

4.caches结果(以JSON既杰克逊和GSON,或XML或纯文本文件或二进制文件,即使使用ORM精简版)。

5.notifies网络请求的结果,你的活动(或其他任何情况下)当且仅当他们还活着

6.no内存泄漏可言,像Android这样装载机,不像安卓AsyncTasks通知自己的UI线程你的活动。

7.uses一个简单而强大的异常处理模型。



Answer 2:

NetworkOnMainThreadException:当应用程序试图在其主线程进行网络操作时引发的异常。

你应该叫sendfeedback方法上的AsyncTask那么只有上面的代码将正常工作。 作为Web服务器正在采取大量的时间来响应主线程变得反应迟钝。 为了避免它,你应该把它在另一个线程。 因此的AsyncTask是更好的。

http://android-developers.blogspot.in/2009/05/painless-threading.html



文章来源: HttpURLConnection is throwing exception [duplicate]