Android使用HttpUrlConnection来实现网络请求,亲测有效

41 篇文章 0 订阅

产品提出需求,需要再视频播放完毕后把当前的播放位置上传给服务器。作为一名不爱造轮子的程序员,我果断的使用了三方的视屏播放器,以module依赖的形式导入到了工程,也由此产生了一个问题,三方module没有Application的,也就无法进行集成OkGo来进行简单的网络请求了。这里插入一句,在主module里通过调用辅助module的方法来给三方实现okGo的初始化为什么不可以呢?

回归正题,于是我就在三方的视频回退操作中用原生的网络请求了,代码如下(原生的网络请求必须开启子线程):

new Thread(new Runnable() {
    @Override
    public void run() {
        //自己写一个HttpUrlConnection发起网络请求
        String urlPath = new String("http://47.104.108.249:8081/api/edu/mmtb/app/res/multi_media_record/");
        JSONObject jsonObject=new JSONObject();
        try {
            jsonObject.put("resMultiMediaId",1);
            jsonObject.put("record","10000");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        //建立连接f
        URL url = null;
        try {
            url = new URL(urlPath);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HttpURLConnection httpConn = null;
        try {
            httpConn = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置连接超时,2000ms
        httpConn.setConnectTimeout(2000);
        //设置指定时间内服务器没有返回数据的超时,5000ms
        httpConn.setReadTimeout(5000);
        //设置参数
        httpConn.setDoOutput(true);   //需要输出
        httpConn.setDoInput(true);   //需要输入
        httpConn.setUseCaches(false);  //不允许缓存
        try {
            httpConn.setRequestMethod("POST");   //设置POST方式连接
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
        //设置请求属性,给请求头添加东西
        httpConn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
        httpConn.setRequestProperty("accept", "application/json");
        httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
        httpConn.setRequestProperty("Charset", "UTF-8");
        httpConn.setRequestProperty("token", "VjJaMzQxcE9ENjkJMDAwMDYJOHhkTAloZWp1bi5lZHUuYXBwMTUyNDc5NzEwNQ==");
        //建立输入流,向指向的URL传入参数
        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(httpConn.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            dos.writeBytes(String.valueOf(jsonObject));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            dos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获得响应状态
        //获得响应状态
        int resultCode = 0;
        try {
            resultCode = httpConn.getResponseCode();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (HttpURLConnection.HTTP_OK == resultCode) {
            StringBuffer sb = new StringBuffer();
            String readLine = new String();
            BufferedReader responseReader = null;
            try {
                responseReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while ((readLine = responseReader.readLine()) != null) {
                    sb.append(readLine).append("\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                responseReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.i("zhangjiaren", sb.toString());
        }
    }
}).start();

因为后台需要以json的形式来上传数据,幸好我经常用JsonObject和JsonArray,拼一个传过去就可以了。当然,前提是已经成功的链接上了服务器,再把拼接好的json字符串通过io流的方式传输过去,并且以字节流的形式,即二进制,很明显,这样是为了保证数据不会解析错误。以上就是“Android使用HttpUrlConnection来实现网络请求”了。

最后说一句,后来题主灵机一动,想想EventBus是在线程间进行操作的,两个module的主线程应该是一样的,为何不试试呢?于是果然不出所料,EventBus也是可以的。代码如下:

VideoEvents videoEvents = new VideoEvents().setType(VideoEvents.VE_SURFACEHOLDER_FINISH_FULLSCREEN);
videoEvents.duration=currentPosition;
videoEvents.obj = CURRENT_STATE;
EventBus.getDefault().post(videoEvents);

上面的是发送消息的,下面的是接收数据后的处理:

public void onEventMainThread(VideoEvents videoEvents) {
        if (videoEvents.type == VideoEvents.VE_SURFACEHOLDER_FINISH_FULLSCREEN) {
            Log.i("zhangjiaren","wa,amazing");
            String position=String.valueOf(videoEvents.duration);
            Map<String, String> map = new HashMap<>();
            map.put("resMultiMediaId","1");
            map.put("record",position);
            JSONObject jsonObject=new JSONObject(map);
            OkGo.<String>post(Constants.POST_MEDIA_POINT)
                    .headers("token", SPUtil.DEFAULT.getString("token",""))
                    .upJson(jsonObject)
                    .execute(new com.lzy.okgo.callback.StringCallback() {
                        @Override
                        public void onSuccess(Response<String> response) {
                            //拉取书本信息成功,进行数据绑定
                            Log.i("zhangjiaren",response.body());
                            if (200==response.code()){
                                try {
//                                    parserData(response.body());
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                        @Override
                        public void onError(Response<String> response) {
                            Log.i("zhangjiaren","拉取书本信息请求出错了");
                        }
                    });
        }
    }
ok,写一下,两年后又需要用到HttpUrlConnection时候,可以15分钟搞定了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值