HttpUtil 【判断网络连接的封装类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
该封装类主要包括以下功能:
判断是否有网络连接、判断是否有可用的网络连接;
判断是否是3G网络、判断mobile网络是否可用;
判断是否是wifi、判断wifi网络是否可用;
判断网络是否为漫游;
判断GPS是否打开。
目前常用的场景是,在调用接口之前先判断是否有网络连接,如果有网络连接,则执行网络请求接口,否则提示“当前网络未连接”。其他方法暂时不经常用。
效果图
暂不需要
代码分析
Configs:存放是否测试的常量值。(也可以存放其他常量值)
HttpUtil:封装常用的方法的封装类。
NetWorkHelper:进行网络判断的具体实现类。
使用步骤
一、项目组织结构图
注意事项:
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; }
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(); } } }
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; } }
在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的显示风格】
混淆配置
无
参考资料
暂时空缺