• Android 网络请求(Http,Socket)报错 :void com.android.okhttp.internal.http.Transport.writeRequestHeaders


    打印出来的异常报错为:java.lang.NullPointerException: Attempt to invoke interface method 'void com.android.okhttp.internal.http.Transport.writeRequestHeaders(com.android.okhttp.Request)' on a null object reference

    本来是Android 端调用接口,发送post请求,报错如上

    我自己是知道在调用接口的中间环节有问题,具体哪个问题,我没查出来

    知道是调用接口的地方报错,初步分析有没有可能是服务端有问题,然后用postman测试了一下,调不通,提示没有访问权限,不科学,因为我安卓程序有些接口是可以调通的,仔细看看,原来是token没填写,导致没权限,然后把token填上,发现是可以的。

    这样就排除了服务端的问题,然后就开始排查安卓端

    因为我其它接口可以通,就那一个不通,自己看看代码也没差异

    然后我就一步步的F8走起,发现我正常的接口没有报错,然后我那个有问题的接口报错了,这个报错比上面那个细化多了

    Android之NetworkOnMainThreadException异常

    这次在网上查这个,发现从Honeycomb SDK(3.0)开始,google不再允许网络请求(Http,socket)等相关操作直接在Main Thread类中,因为直接在UI线程中操作会阻塞UI,体验不好,如果是3.0版本一下,则可以继续在Main Thread中,3.0以上则不行,则需要重新开一个线程去处理

                new Thread(() -> {
                    HttpReturn jsonStr = PutonLocHandler.PutonLocRequest(groupCarRequest);
                    final RequestData reqData = (RequestData) JSONObject.parseObject(jsonStr.getResponseMsg(),RequestData.class);
                Log.i("Dog","endurl");
                handler.post(() -> {
                    if (reqData.isSUCCESS()) {
                        PickCar.TakNo = reqData.getMSG();
                        PickCar.Status = 1;
    //                    ((EditText)findViewById(R.id.txt_TaskNo)).setText(PickCar.TakNo);
    
                      // 上架成功,界面提示,多行文本框加一行
                        tv_CaseIdList.append(caseID);
                        tv_CaseIdList.append(System.getProperty("line.separator"));
                        tv_msg.setText(reqData.getMSG());
                        tv_msg.setTextColor(Color.BLUE);
                    } else {
                        Toast.makeText(PutonLocActivity.this, reqData.getMSG(), Toast.LENGTH_SHORT).show();
                        tv_msg.setText(reqData.getMSG());
                        tv_msg.setTextColor(android.graphics.Color.RED);
                    }
                });
                }).start();

     如上所示,必须开个线程把调用接口那部分代码给丢进去,这样就可以了

    还有个小技巧,就是

    Log.i("Dog","Dog2");
    这个东西是个好东西,在catch中把 Exception 给打印出来,每个方法都加一个try catch吧,不然方法调方法,抛出的是最外层的错误,不容易看出具体错误,还要一步步的去断点去找,所以,最好在写代码的时候每个方法都加一个异常处理,不然就会导致写代码一小时,找问题一小时了

    毕竟按F8按多了,也麻烦,因为我没找到类似于vs中F5的快捷键,就这个鬼,卡了我差不多一个小时
    
    
  • 相关阅读:
    线段树合并
    bzoj 3675 [Apio2014]序列分割
    模版总结【长期更新】
    动态规划的题目总结(长期更新)
    搜索(另类状态BFS):NOIP 华容道
    贪心(模拟费用流):NOIP2011 观光公交
    基础算法(二分,贪心):NOIP 2012 疫情控制
    模拟(堆):USACO Jan11 瓶颈
    搜索(DLX重复覆盖模板):HDU 2295 Radar
    数学:lucas定理的总结
  • 原文地址:https://www.cnblogs.com/OmySql/p/16427707.html
Copyright © 2020-2023  润新知