HttpUtil 【判断网络连接的封装类】

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

该封装类主要包括以下功能:

判断是否有网络连接、判断是否有可用的网络连接;

判断是否是3G网络、判断mobile网络是否可用;

判断是否是wifi、判断wifi网络是否可用;

判断网络是否为漫游;

判断GPS是否打开。

目前常用的场景是,在调用接口之前先判断是否有网络连接,如果有网络连接,则执行网络请求接口,否则提示“当前网络未连接”。其他方法暂时不经常用。

效果图

暂不需要

代码分析

Configs:存放是否测试的常量值。(也可以存放其他常量值)

HttpUtil:封装常用的方法的封装类。

NetWorkHelper:进行网络判断的具体实现类。

使用步骤

一、项目组织结构图

HttpUtil 【判断网络连接的封装类】

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将Configs、HttpUtil、NetWorkHelper类复制到项目中

package com.why.project.httputildemo.util.httputil;

/**
* Used 用于HttpUtil
*/
public class Configs {
/**
* 是否测试版,用于HttpUtil
* <br/>0 - 测试版
* <br/>1 - 正式版*/
public static int TEST_FLAG = 1;
// public static int TEST_FLAG = 0; }

Configs

package com.why.project.httputildemo.util.httputil;

import android.content.Context;
import android.util.Log; import java.io.UnsupportedEncodingException; /**
* Used 判断网络连接的封装类
*/
public class HttpUtil { /**
* 仅仅用来判断是否有网络连接
*/
public static boolean isNetworkAvailable(Context context) {
if (Configs.TEST_FLAG == 0)
{
return true;
} else {
return NetWorkHelper.isNetworkAvailable(context);
}
} /**
* 判断是否有可用的网络连接
* */
public static boolean isNetworkConnected(Context context) {
if (Configs.TEST_FLAG == 0)
{
return true;
} else {
return NetWorkHelper.isNetworkConnected(context);
}
} /**
* 判断mobile网络是否可用
*/
public static boolean isMobileDataEnable(Context context) {
String TAG = "httpUtils.isMobileDataEnable()";
try {
return NetWorkHelper.isMobileDataEnable(context);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
e.printStackTrace();
return false;
}
}
/**
* 判断wifi网络是否可用
*/
public static boolean isWifiDataEnable(Context context) {
String TAG = "httpUtils.isWifiDataEnable()";
try {
return NetWorkHelper.isWifiDataEnable(context);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
e.printStackTrace();
return false;
}
}
/**
* 判断是否为漫游
*/
public static boolean isNetworkRoaming(Context context) {
return NetWorkHelper.isNetworkRoaming(context);
} /**
* 编码测试
*/
public static void testCharset(String datastr) {
try {
String temp = new String(datastr.getBytes(), "GBK");
Log.v("TestCharset", "****** getBytes() -> GBK ******/n" + temp);
temp = new String(datastr.getBytes("GBK"), "UTF-8");
Log.v("TestCharset", "****** GBK -> UTF-8 *******/n" + temp);
temp = new String(datastr.getBytes("GBK"), "ISO-8859-1");
Log.v("TestCharset", "****** GBK -> ISO-8859-1 *******/n" + temp);
temp = new String(datastr.getBytes("ISO-8859-1"), "UTF-8");
Log.v("TestCharset", "****** ISO-8859-1 -> UTF-8 *******/n" + temp);
temp = new String(datastr.getBytes("ISO-8859-1"), "GBK");
Log.v("TestCharset", "****** ISO-8859-1 -> GBK *******/n" + temp);
temp = new String(datastr.getBytes("UTF-8"), "GBK");
Log.v("TestCharset", "****** UTF-8 -> GBK *******/n" + temp);
temp = new String(datastr.getBytes("UTF-8"), "ISO-8859-1");
Log.v("TestCharset", "****** UTF-8 -> ISO-8859-1 *******/n" + temp);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}

HttpUtil

package com.why.project.httputildemo.util.httputil;

import android.content.Context;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager; import java.util.List; /**
* Used 网络连接的判断:是否有网络、网络是否可用、判断是wifi还是3G、判断wifi是否可用、判断3G是否可用
* 权限 android.permission.ACCESS_NETWORK_STATE
*/
public class NetWorkHelper {
/**
* 仅仅用来判断是否有网络连接
*/
public static boolean isNetworkAvailable(Context context) {
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if(manager != null){
// 获取当前活动的NetworkInfo对象
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null) {
/*Log.d(TAG, "info.isAvailable=="+info.isAvailable());*/
return networkInfo.isAvailable();
}
}
return false;
} /**
* 判断是否有可用的网络连接
* */
/*
* 只打开3G连接的时候:
* 0===类型===MOBILE
* 0===状态===CONNECTED
* 打开wifi连接和3G连接的时候:
* 0===类型===MOBILE
* 0===状态===DISCONNECTED
* 1===类型===WIFI
* 1===状态===CONNECTED
* */
public static boolean isNetworkConnected(Context context) { boolean netstate = false; ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); if (manager != null)
{
NetworkInfo[] networkInfo = manager.getAllNetworkInfo();
if (networkInfo != null) {
for (int i = 0; i < networkInfo.length; i++)
{
/*Log.d(TAG,i + "===类型===" + info[i].getTypeName());
Log.d(TAG,i + "===状态===" + info[i].getState());*/
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)
{
netstate = true;
break;
}
}
}
}
return netstate;
} /**
* 判断是否是wifi,用户的体现性在这里了,wifi就可以建议下载或者在线播放
* */
public static boolean isWifi(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null
&& networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
return false;
} /**
* 判断wifi 是否可用
* @param context
* @return
* @throws Exception
*/
public static boolean isWifiDataEnable(Context context) throws Exception {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); boolean isWifiDataEnable = false; isWifiDataEnable = manager.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
return isWifiDataEnable;
} /**
* 判断是否是3G网络
* */
public static boolean is3rd(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null
&& networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return true;
}
return false;
} /**
* 判断3G网络是否可用
*
* @param context
* @return
* @throws Exception
*/
public static boolean isMobileDataEnable(Context context) throws Exception {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean isMobileDataEnable = false;
isMobileDataEnable = manager.getNetworkInfo(
ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting(); return isMobileDataEnable;
} /**
* 判断网络是否为漫游
*/
public static boolean isNetworkRoaming(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE) {
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
if (tm != null && tm.isNetworkRoaming()) {
return true;
} else {
}
}
}
return false;
}
/**
* 判断GPS是否打开
* */
public static boolean isGpsEnabled(Context context) {
LocationManager lm = ((LocationManager) context
.getSystemService(Context.LOCATION_SERVICE));
List<String> accessibleProviders = lm.getProviders(true);
return accessibleProviders != null && accessibleProviders.size() > 0;
} }

NetWorkHelper

在strings.xml文件中添加以下代码

<resources>
<string name="app_name">HttpUtilDemo</string> <!-- ******************公共字段:用于HttpUtil****************** -->
<string name="network_enable">当前网络未连接</string>
<string name="network_terrible">当前网络不佳,请检查您的网络设置。</string>
<string name="network_error">网络连接异常</string>
<string name="network_timeout">网络请求超时,请重试</string>
<string name="network_unavailable">网络连接不可用</string>
<!-- 公共字段 end--> </resources>

在AndroidManifest.xml中添加以下代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.why.project.httputildemo"> <!-- ======================授权访问网络(HttpUtil)========================== -->
<!-- 允许程序打开网络套接字 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 允许程序访问有关GSM网络信息 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许程序访问Wi-Fi网络状态信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许一个程序访问精良位置(如GPS) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 访问电话状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application> </manifest>

三、使用方法

以登录网络请求接口为例,大概的写法如下(此处只是框架,不含有登录接口的具体实现方法)

package com.why.project.httputildemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import com.why.project.httputildemo.util.httputil.HttpUtil; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Login();
} /**
* 程序登录
*/
private void Login(){
if (HttpUtil.isNetworkAvailable(this)) {
//执行网络请求接口
}else{ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.network_enable));
}
}
}

注意:Toast提示,这里使用的是ToastUtil【简单的Toast封装类】【未自定义Toast的显示风格】

混淆配置

参考资料

暂时空缺

项目demo下载地址

https://github.com/haiyuKing/HttpUtilDemo

上一篇:Unity判断网络连接类型


下一篇:DBCP配置数据库连接乱码问题