Android网络状态差的处理方案

作者: 绮怀先生 | 来源:发表于2016-06-08 10:13 被阅读2792次

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

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

    //有网
    if (Utils.isNetworkConnected(this)) {
        loadingView.setVisibility(View.VISIBLE);//显示正在加载
        //联网获取数据
        getDataFromNet();
    } else {//没网直接显示本地数据.
        showView();
        Toast.makeText(this, "离线状态中", Toast.LENGTH_SHORT).show();
    }```
    
    离线状态时加载本地数据:
    ![离线模式.jpg](http:https://img.haomeiwen.com/i1232173/a2d80ab9c11111cd.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ##2,有网情况下##
     有网的时候也还是能分两种情况的:
    一,网速好的情况下,当然加载数据非常顺利,就不赘述了.
    
    二,网速不稳定的情况下:
       我遇到的情况是这样的:在网速不稳定的情况下,
    a,有时是连接超时(根本就连不上服务器)
    b,有时是调用接口返回数据result!=0(即虽然连上服务器了,因为网速很慢,又不稳定,在返回数据的时候网络中断了)
    c,**更糟糕的是   偶发性**的一直停留在加载页面中,用户体验很差.
    其原因:****
    ![一直停留在加载页面.jpg](http:https://img.haomeiwen.com/i1232173/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下载连接

    相关文章

      网友评论

      • Master_Yang:我上次流量与这次流量差距基本为0,然后就说网速差??我都没有请求网络呢
      • Master_Yang:根本就不对,你这是统计流量而已,并没有获取到网速,我要的是获取网速,不是流量
      • kk041kk:标记一下
      • 无玄:把超时时间设置短些不就行了吗?
      • 皮球二二:这样不会造成网络更慢了?
        皮球二二:@绮怀先生 哦我理解错了
        绮怀先生: @r17171709 Traffic记录的是网络流量,不影响网络状况,不知道您指的是哪段代码造成网络慢呢?
      • 0afb31d2caa5:很好学习一下
      • 8314e3a0c30e:写的不错, 我喜欢这个解决方式。

      本文标题:Android网络状态差的处理方案

      本文链接:https://www.haomeiwen.com/subject/pwhjdttx.html