打印出来的异常报错为: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的快捷键,就这个鬼,卡了我差不多一个小时
不喜欢写代码,就喜欢改代码,C#/Python都可以,欢迎各位留言探讨!