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() {
                    @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);

Android网络状态差的处理方案_第1张图片
联网失败加载本地数据.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 断定网速很差,直接取消该请求,进入离线模式

Android网络状态差的处理方案_第2张图片
连续四次检测网速都小于20kb/s 断定网速差..png

Android网络状态差的处理方案_第3张图片
网络情况较差.jpg

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

你可能感兴趣的:(Android网络状态差的处理方案)