NetDiagnosis.java 3.33 KB
package com.chudiangameplay.android.manager;

import android.content.Context;

import com.chudiangameplay.android.exception.PingResult;
import com.chudiangameplay.android.exception.TraceRouteResult;
import com.chudiangameplay.android.interface_.OkHttpCallBack;
import com.chudiangameplay.android.responce.BaseResponce;
import com.chudiangameplay.android.responce.StringListResponce;
import com.chudiangameplay.android.tool.Log;
import com.chudiangameplay.android.tool.SPUtil;
import com.chudiangameplay.android.util.PingOutput;
import com.qiniu.android.netdiag.Ping;
import com.qiniu.android.netdiag.TraceRoute;
import com.tencent.bugly.crashreport.CrashReport;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by 0 on 2019/6/18.
 */

public class NetDiagnosis {
    private static String TAG = NetDiagnosis.class.getName();
    private String diagnosisTime = "diagnosis_time";
    private long diagnosisCoolDown = 10 * 60 * 1000;
    private String[] targets = {"https://api-app.apeiwan.com", "101.37.152.140"};

    private NetDiagnosis() {}
    private static volatile NetDiagnosis singleton;

    public static NetDiagnosis getInstance() {
        if (singleton == null) {
            synchronized (NetDiagnosis.class) {
                if (singleton == null) {
                    singleton = new NetDiagnosis();
                }
            }
        }
        return singleton;
    }

    public void startDiagnose(Context mContext){
        long lastTime = SPUtil.getLongValue(mContext, diagnosisTime, 0);
        if(System.currentTimeMillis() - lastTime < diagnosisCoolDown){
            return;
        }
        SPUtil.putValue(mContext, diagnosisTime, System.currentTimeMillis());
        API_LoginManager.trace_list(mContext,  new OkHttpCallBack() {
            @Override
            public void onSuccess(BaseResponce baseResponce) {
                if(baseResponce instanceof StringListResponce){
                    StringListResponce res = (StringListResponce) baseResponce;
                    if(res != null && res.data != null && res.data.size() > 0){
                        ping(res.data);
                    }
                }
            }

            @Override
            public void onFailure(BaseResponce baseResponce) {
                List temp = new ArrayList<>(Arrays.asList(targets));
                ping(temp);
            }
        });
    }

    private void ping(final List<String> data){
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(String ip : data){
                    Ping.start(ip, new PingOutput(), new Ping.Callback() {
                        @Override
                        public void complete(Ping.Result r) {
                            Log.i(TAG , r.result);
                            CrashReport.postCatchedException(new PingResult(r.result));
                        }
                    });
                    TraceRoute.start(ip, new PingOutput(), new TraceRoute.Callback() {
                        @Override
                        public void complete(TraceRoute.Result r) {
                            Log.i(TAG , r.content());
                            CrashReport.postCatchedException(new TraceRouteResult(r.content()));
                        }
                    });
                }
            }
        }).start();
    }
}