论坛首页 移动开发技术论坛

程序第一次发送网络请求会阻塞大改5秒的奇怪问题

浏览 5250 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-11-05  

代码如下:

package com.example;

import java.net.HttpURLConnection;
import java.net.URL;


import android.os.Bundle;
import android.util.Log;
import android.app.Activity;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		try {
			
			URL uri = new URL("http://www.baidu.com/");
			HttpURLConnection conn = (HttpURLConnection)uri.openConnection();
			conn.setRequestMethod("GET");
			
			conn.setConnectTimeout(5000);
			conn.setReadTimeout(5000);
			
			Log.i("MainActivity", "start connection");
			conn.connect();
			Log.i("MainActivity", "end connection");
			
			conn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

运行结果:

 

只有第一次启动时会出现这种情况。第一次启动是指:在程序管理里面强制结束程序进程后,启动应用。如果不强制结束进程,则退出再启动时就是很快就有返回结果。

 

同样的代码在普通的java程序里面就没有这个问题,不知道是不是在系统底层做了什么修改。

  • 大小: 32.3 KB
   发表时间:2013-11-05  
android调用disconnect方法socket没有断开的。
0 请登录后投票
   发表时间:2013-11-09  
pgq102040818 写道
android调用disconnect方法socket没有断开的。

如何才能提高第一次调用时的速度呢
0 请登录后投票
   发表时间:2013-11-11  
你连Activity的声明周期都没有搞清楚

onCreate是进程被创建的时候才调用,你退出也好,怎么样也好,只要进程没被干掉,你再进来这个方法都不会被调用。

还有,在主线程里建立网络连接是客户端设计里最避讳的一件事情,你应该把这个操作移到其他的线程里
0 请登录后投票
   发表时间:2013-11-11  
须等待 写道
你连Activity的声明周期都没有搞清楚

onCreate是进程被创建的时候才调用,你退出也好,怎么样也好,只要进程没被干掉,你再进来这个方法都不会被调用。

还有,在主线程里建立网络连接是客户端设计里最避讳的一件事情,你应该把这个操作移到其他的线程里



1.按返回键推出然后再进入时会再次调用onCreate方法,这个是符合Activity生命周期的。
2.上面的例子只是一个简单的测试,是为了说明问题。真正的项目里面自然不会放到主线程去做网络请求。

关于:onCreate是进程被创建的时候才调用,你退出也好,怎么样也好,只要进程没被干掉,你再进来这个方法都不会被调用。
请经过测试后再下结论。
0 请登录后投票
   发表时间:2013-11-11  
酷的飞上天空 写道
须等待 写道
你连Activity的声明周期都没有搞清楚

onCreate是进程被创建的时候才调用,你退出也好,怎么样也好,只要进程没被干掉,你再进来这个方法都不会被调用。

还有,在主线程里建立网络连接是客户端设计里最避讳的一件事情,你应该把这个操作移到其他的线程里



1.按返回键推出然后再进入时会再次调用onCreate方法,这个是符合Activity生命周期的。
2.上面的例子只是一个简单的测试,是为了说明问题。真正的项目里面自然不会放到主线程去做网络请求。

关于:onCreate是进程被创建的时候才调用,你退出也好,怎么样也好,只要进程没被干掉,你再进来这个方法都不会被调用。
请经过测试后再下结论。


如果你是进程的最后一个Activity那是退出就没了,如果不是,有一个创建模型,默认是不会创建新的,因为你以前的对象会被缓存
0 请登录后投票
   发表时间:2013-11-11  
须等待 写道
如果你是进程的最后一个Activity那是退出就没了,如果不是,有一个创建模型,默认是不会创建新的,因为你以前的对象会被缓存

确实是进程的最后一个Activity,因为是新建了一个Android项目来测试这个问题,里面只有上面的一个Activity。
貌似有点偏离主题了,我想问的是第一次请求网络时遇到的阻塞问题是什么原因,怎么才能避免或者减少阻塞的时间。
0 请登录后投票
   发表时间:2013-11-11  
酷的飞上天空 写道
须等待 写道
如果你是进程的最后一个Activity那是退出就没了,如果不是,有一个创建模型,默认是不会创建新的,因为你以前的对象会被缓存

确实是进程的最后一个Activity,因为是新建了一个Android项目来测试这个问题,里面只有上面的一个Activity。
貌似有点偏离主题了,我想问的是第一次请求网络时遇到的阻塞问题是什么原因,怎么才能避免或者减少阻塞的时间。


你这个5秒应该是超时的时间,我开始没仔细看你的代码,你可以在adb shell环境里尝试ping baidu.com来测试网络连接是不是通的
0 请登录后投票
   发表时间:2013-12-25  
android4.0之后的网络交互是不可以放到UI线程的  写一个异步任务就可以了
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics