Android网络
Android  /  houtizong 发布于 3年前   185
Android访问网络有很多种方式,比如WiFi,移动网络(3G等)...
他们是有一个优先级的。
这是系统默认的,可以通过API来改变这种优先级。比如:当3G连接,连接WiFi,我们希望仍然使用3G网络,那么
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
当这样设置之后,会自动断开WiFi连接。
那通过代码,怎么知道WiFi是否连接或者移动网络是否连接呢?
//判断是否有网络连接 public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); //connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE); return (networkInfo != null && networkInfo.isAvailable()); } //判断WiFi是否连接 public boolean isWifiConnected() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return (networkInfo != null && networkInfo.isConnected()); } //判断移动网络是否连接 public boolean isMobileConnected() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); return (networkInfo != null && networkInfo.isConnected()); }
判断WiFi是否连接,还可以通过WifiManager
//判断WiFi是否连接 public boolean isWifiConnected() { WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); return wifiInfo != null && SupplicantState.COMPLETED == wifiInfo.getSupplicantState(); } return false; }
它还提供了很多操控WiFi的方法,比如连接或断开WiFi连接,打开或关掉WiFi等。
有WiFi连接并不等于连接到Internet。比如:手机连接到无线路由器,而无线路由器没有连接Internet,这种情况可以用代码容易地判断
//判断WiFi连接时是否能够访问Internet public boolean hasWifiInternetAccess() { WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if(mWifiManager.isWifiEnabled()) { return mWifiManager.pingSupplicant(); } return false; }
上面的方法其实并不能准确的判断当WiFi连接是是否可以访问Internet。例如,当连接到机场的WiFi,它需要打开浏览器,在弹出的页面上输入用户名密码,此时pingSupplicant返回的是TRUE,当这种情况时,只能通过代码访问某个网址,检查返回值来检测是否能够上网。
通常,为了更好的用户体验,比较大的网络请求只在有WiFi的情况下才发出,比如下载地图数据,下载高质量的音乐。因为网络请求是一个比较耗时的操作,所以不能放在主线程(UI线程)进行,了解更多请点击这里。可以使用Android中的AsyncTask发送网络请求。
TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_network_test); textView = (TextView) findViewById(R.id.textView); NetworkTask networkTask = new NetworkTask(); networkTask.execute(); } private class NetworkTask extends AsyncTask<Void, Void, Void> { String statusCode = ""; @Override protected Void doInBackground(Void... voids) { //耗时操作。在这里是发送网络请求,系统会将本方法里面的代码在新的工作线程里面执行 DefaultHttpClient client = new DefaultHttpClient(); HttpParams params = client.getParams(); int timeoutInMillisecond = 10000; HttpConnectionParams.setConnectionTimeout(params, timeoutInMillisecond); HttpConnectionParams.setSoTimeout(params, timeoutInMillisecond); int retryTimes = 1; if (retryTimes > 0) { client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(retryTimes, true)); } HttpGet get = new HttpGet("http://www.cchen.com"); HttpResponse response = null; try { response = client.execute(get); statusCode = String.valueOf(response.getStatusLine().getStatusCode()); } catch (IOException e) { statusCode = "-1"; } return null; } @Override protected void onPostExecute(Void aVoid) { //更新UI。上面方法执行完毕后,系统会在主线程(UI线程)执行本方法中的代码 textView.append(statusCode + "\n"); } }
注意,上面的HttpConnectionParams设置了两个Timeout:
上面代码设置两个timeout都是10秒。那假如手机不能上网,是不是10秒之后才会抛出异常呢?答案是否定的。
还有当我们听着音乐回到家中,手机自动连接到WiFi,这个时候程序就应该播放高质量的音乐了,那我们怎么知道手机的网络连接类型发生了变化呢?Android系统在手机网络类型发生变化的时候,会发送一个广播
ConnectivityManager.CONNECTIVITY_ACTION
所以,我们只需要监听这个广播,再利用上面的代码,就能轻易得知当前网络类型,然后进行相关操作。
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接