在一次使用Retrofit访问服务器的过程中,一直访问失败
val namecall:Call<NameBean> = ipService.getNameForId(s) Log.d("zzz", "namecall:----${namecall} ") namecall.enqueue(object:Callback<NameBean>{ override fun onFailure(call: Call<NameBean>, t: Throwable) { Log.d("zzz", "onFailure: ") t.printStackTrace() val sw = StringWriter() t.printStackTrace(PrintWriter(sw)) Log.d("zzz", "t.printStackTrace():${ sw.toString()}") } override fun onResponse(call: Call<NameBean>, response: Response<NameBean>) { Log.d("zzz", "onResponse: ") if (response != null) { if(response.isSuccessful) { val getid:NameBean=response.body() Log.d("zzz", getid.toString()) Toast.makeText(MainActivity.mainactivity,getid.toString(),Toast.LENGTH_SHORT).show() } else { Toast.makeText(MainActivity.mainactivity,"error",Toast.LENGTH_SHORT).show() } } } })
在上面的onFailure(call: Call<NameBean>, t: Throwable)中想看看t到底输出上面错误,
使用 t.printStackTrace() 后调用t.getCause()却打印出null
于是网上找到解决方法:
t.printStackTrace()
val sw = StringWriter()
t.printStackTrace(PrintWriter(sw))
Log.d("zzz", "t.printStackTrace():${ sw.toString()}")
成功打印出错误,然后解决了错误。
是因为
安卓p默认把http传输请求都拒绝了。
解决方法
1.在build.gradle中把targetSdkVersion改为27及以下。
targetSdkVersion 27 //对应的是android 8.1, 28是9.0 所以。。
1
2.在AnroidManifest.xml中添加
android:usesCleartextTraffic="true" //默认是false,现改为true
1
3.最根本的方法是将app改为https传输,同时服务器端也需支持https