Android的HTTP网络请求超时UI更新(回调)

2019-03-02  本文已影响0人  亭书浅墨_8809

原因及运行原理

当在网络请求出现连接超时(httpURLConnection.setConnectTimeout(TimeOut))的时候,此时调用的活动中的Dialog弹窗会一直浮现在桌面上,而网络请求是位于子线程,活动只是调用之后就没有太多的关联,这时当网络出现连接超时的时候会一直卡在httpURLConnection.connect()中,此时可以在网络请求类中新建一个接口,并且实现一个刷新方法,再在活动中实例化一个请求类,并且参数为接口对象,然后再到网络请求出现超时,并且抛出异常的try...catch代码块的异常处理块中用接口对象调用刷新的方法,由于接口内的刷新方法时抽象方法,所以会自动往子级里面去找到运行的代码块,也就是说运行活动中覆写的代码块,注意:虽然运行的代码块时活动中的,但是其调用的主体方法还是在子线程中,所以需要更新UI的时候,还是需要回调到主线程中

public  class BaseHttpConn {

    private static final String TAG = "BaseHttpConn";
    private static TimeOut shuaxin;
    private static int TimeOut = 3*1000;
    public static HttpURLConnection httpConn(String baseUrl, HashMap<String, String> map) {
        HttpURLConnection httpURLConnection = null;
        try {
            URL url = new URL(baseUrl);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setConnectTimeout(TimeOut);//连接超时
            httpURLConnection.setReadTimeout(TimeOut);//读取超时
            httpURLConnection.setRequestMethod("POST");//请求方式
            httpURLConnection.setInstanceFollowRedirects(true);//是否重定向
            httpURLConnection.setUseCaches(true);//是否启用缓存
            httpURLConnection.setRequestProperty("Content-Type","application/json");//传入服务器的数据类型
            OutputStream outputStream = httpURLConnection.getOutputStream();
            outputStream.write(getByte(map));
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            httpURLConnection.disconnect();//关闭此次网络请求
            shuaxin.ShuaXin();//通过接口对象调用抽象方法ShuaXin();

        }
        return httpURLConnection;
    }

    private static byte[] getByte(HashMap<String,String> map) {
        JSONObject jsonObject = new JSONObject();
        for(String key: map.keySet()){
            try {
                jsonObject.put(key,map.get(key));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return jsonObject.toString().getBytes();
    }

    public BaseHttpConn(TimeOut timeOut) {
        this.shuaxin = timeOut;
    }

    //监听接口
    public interface TimeOut{
        void ShuaXin();//接口中刷新的方法
    }

}

活动中的代码

     BaseHttpConn baseHttpConn = new BaseHttpConn(new BaseHttpConn.TimeOut() {
        @Override
        public void ShuaXin() {
            progressDialog.dismiss();
            getActivity().runOnUiThread(new Runnable() {//位于碎片中,所以需要通过getActivity()获取活动
                @Override
                public void run() {
                    Toast.makeText(getContext(),"网络连接失败",Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
上一篇下一篇

猜你喜欢

热点阅读