当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection正在抛出异常[重复]

呼延辰龙
2023-03-14

这是我连接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。操作系统。NetworkOnMainThreadException

请帮忙。

共有2个答案

龚镜
2023-03-14

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

您应该在asynctask上调用sendfeedback方法,这样只有上面的代码才能工作。由于Web服务器需要花费大量时间来响应,主线程变得没有响应。为了避免它,你应该在另一个线程上调用它。因此asynctask更好。

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

景子安
2023-03-14

Android操作系统。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提供的各种API。util。并发包,例如Executor、ThreadPoolExecutor和FutureTask。

robospice中asynctask的替代方案。https://github.com/octo-online/robospice.

rospice的一些特性。

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

2.是强类型!您使用POJO发出请求,并获得POJO作为请求结果。

3.对用于请求的POJO和您在项目中使用的活动类均不施加任何约束。

4.缓存结果(使用Jackson和Gson的Json,或Xml,或平面文本文件,或二进制文件,甚至使用ORM Lite)。

5.当且仅当您的活动(或任何其他上下文)仍处于活动状态时,才通知您的活动(或任何其他上下文)网络请求的结果

6.与Android Loader不同,Android AsyncTasks在其UI线程上通知您的活动,完全没有内存泄漏。

7.使用简单但健壮的异常处理模型。

 类似资料:
  • 问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常:

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。

  • 你怎么捕获一个异常,之后在另外一个线程上重新抛出?使用在标准文档18.8.5中描述的异常传递中的方法吧,那将显示标准库的魔力。 exception_ptr current_exception(); 返回一个exception_ptr 变量,它将指向现在正在处理的异常(15.3)或者现在正在处理的异常的副本(拷贝),或者有的时候在当前没有遇到异常的时候,返回值为一个空的exception_ptr变量

  • 我尝试调用getCodeResponse()时遇到IOException。当参数有效时,没有异常,代码响应为200。如果参数错误,服务器应返回401代码。我已经测试了Hull的查询。如果参数错误,我会得到401代码。当出现错误代码时,HttpURLConnection类可能会引发异常。

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静