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;
    
    
}
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

posted @ 2017-05-16 21:20  HaiyuKing  阅读(1389)  评论(0编辑  收藏  举报