Android网络状态差的处理方案

1,在没有网络的情况下的处理##

相信大家面对这个情况处理起来是毫无压力的.

//有网
if (Utils.isNetworkConnected(this)) {
    loadingView.setVisibility(View.VISIBLE);//显示正在加载
    //联网获取数据
    getDataFromNet();
} else {//没网直接显示本地数据.
    showView();
    Toast.makeText(this, "离线状态中", Toast.LENGTH_SHORT).show();
}```

离线状态时加载本地数据:
![离线模式.jpg](http://upload-images.jianshu.io/upload_images/1232173-a2d80ab9c11111cd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##2,有网情况下##
 有网的时候也还是能分两种情况的:
一,网速好的情况下,当然加载数据非常顺利,就不赘述了.

二,网速不稳定的情况下:
   我遇到的情况是这样的:在网速不稳定的情况下,
a,有时是连接超时(根本就连不上服务器)
b,有时是调用接口返回数据result!=0(即虽然连上服务器了,因为网速很慢,又不稳定,在返回数据的时候网络中断了)
c,**更糟糕的是   偶发性**的一直停留在加载页面中,用户体验很差.
其原因:****
![一直停留在加载页面.jpg](http://upload-images.jianshu.io/upload_images/1232173-8535863dbb26c7b1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

a,b情况都好处理:
```java

 NetHttp.getNetData(NetHttp.getMyMessage,//获取任务数据的url
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        if (response.optInt("result") == 0) {
                            dbUtil = DBUtil.getInstance();
                            myMessageTask = new MyMessageTask();
                            myMessageTask.execute(response);
                        } else {
                            showView();
                            Toast.makeText(MyTaskActivity.this, "获取服务器最新数据失败", Toast.LENGTH_SHORT).show();
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d(StaticData.TAG, "获取数据失败:" + error.toString());
                        showView();
                        Toast.makeText(MyTaskActivity.this, "获取服务器最新数据失败", Toast.LENGTH_SHORT).show();
                    }
                }, map);

联网失败加载本地数据.jpg

相信到这里,处理起来都很容易.
难在** c **这种情况,网速很慢,却又稳定,所以在加载界面停留很久.
我的处理方式是
在发送这个请求的同时启动服务定时监测网速变化

定时检测网速Service:

public class NetWorkService extends Service {

    private Handler handler = new Handler();
    private Timer timer;
    private long rxtxTotal = 0;
    private boolean isNetBad = false;
    private int time;
    private double rxtxSpeed = 1.0f;
    private DecimalFormat showFloatFormat = new DecimalFormat("0.00");
    private Intent receiverIntent;
    public final static String NET_SPEED_RECEIVER_ACTION = "com.ridgepm.network_speed_action";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (timer == null) {
            timer = new Timer();
            timer.scheduleAtFixedRate(new RefreshTask(), 0L, (long) 2000);
        }
        receiverIntent = new Intent();
        receiverIntent.setAction(NET_SPEED_RECEIVER_ACTION);
        int result = super.onStartCommand(intent, flags, startId);
        return result;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Service被终止的同时也停止定时器继续运行
        timer.cancel();
        timer = null;
    }
   //定时任务
    class RefreshTask extends TimerTask {

        @Override
        public void run() {
            isNetBad = false;
            long tempSum = TrafficStats.getTotalRxBytes()
                    + TrafficStats.getTotalTxBytes();
            long rxtxLast = tempSum - rxtxTotal;
            double tempSpeed = rxtxLast * 1000 / 2000;
            rxtxTotal = tempSum;
            if ((tempSpeed / 1024d) < 20 && (rxtxSpeed / 1024d) < 20) {
                time += 1;
            } else {
                time = 0;
            }
            rxtxSpeed = tempSpeed;
                Log.i("NetworkSpeedService", showFloatFormat.format(tempSpeed / 1024d) + "kb/s");
            if (time >= 4) {//连续四次检测网速都小于20kb/s  断定网速很差.
                isNetBad = true;
                Log.i("NetworkSpeedService", "网速差 " + isNetBad);
                time = 0; //重新检测
            }
            if (isNetBad) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        receiverIntent.putExtra("is_slow_net_speed", isNetBad);
                        sendBroadcast(receiverIntent);//发送广播去取消这次请求.
                    }
                });
            }
        }

    }
}

连续四次检测网速都小于20kb/s 断定网速很差,直接取消该请求,进入离线模式

连续四次检测网速都小于20kb/s 断定网速差..png

网络情况较差.jpg

检测网络速度Service github下载连接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Android网络状态差的处理方案 后记 说一下个人见解: 觉得用IntentService来处理更好些,因为如果...
    jacky123阅读 867评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,506评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 公元前399年最伟大的教育家苏格拉底被雅典公民法庭判为死刑,罪名是盅惑青年和怠慢雅典国家神,一个月后他坦然喝下了毒...
    張楓阅读 545评论 0 0
  • 又重看了一遍《孝庄秘史》电视剧,果然,电视剧也有类似看书的收获,每一次看的感受都不尽相同。纵然有再多兵戈铁马、一统...
    清悠1202阅读 435评论 6 5