各种报错问题,集合解决办法
java.net.SocketException: socket failed: EPERM (Operation not permitted)
java.net.SocketException:socket failed:EACCES (Permission denied)
java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permitted
D/Netw at java.net.Socket.createImpl(Socket.java:492)orkSecurityConfig: No Network Security Config specified, using platform default
java.io.IOException: Cleartext HTTP traffic to 10.0.2.2 not permitted
java.lang.RuntimeException: Can't create handler inside thread Thread that has not called Looper.prepare()
等等等等
在AndroidManifest.xml文件中,在
并在手级上卸载重新安装APP
或把这两句也加上
在AndroidManifest.xml文件中,在
android:usesCleartextTraffic="true"
此属性指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。
当属性设置为“ false”时,平台组件(例如,HTTP和FTP堆栈,DownloadManager和MediaPlayer)将拒绝应用程序使用明文流量的请求。强烈建议第三方库也采用此设置。避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。
在更高的编译版本中可能上一个办法也没有用,则需要添加配置文件network_security_config.xml
在res文件夹下面新建一个名为xml的文件夹
新建一个network_security_config.xml文件,内容为:
example.com
7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=
在MainActivity.java的onCreate方法里设置
// 设置允许安卓发起网络请求
// StrictMode是指严格模式
if (Build.VERSION.SDK_INT > 9){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);//这两句设置禁止所有检查
}
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,最终帮助开发者优化和改善代码逻辑。
Android模拟器中访问http://localhost:8080失败
原因:Android模拟器把它自己作为了localhost,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器的地址;
解决方案:使用android内置的IP 10.0.2.2 ,10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名;即:http://10.0.2.2:8080
但是有例外的情况,如果使用的不是Android studio自带的模拟器,则需要查看自己电脑的IPv4地址来使用。
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
创建线程的方法:
//简单的创建一个新线程
new Thread(new Runnable() {
@Override
public void run() {
//运行部分的代码放在这一块
}
}).start();
Can't create handler inside thread Thread that has not called Looper.prepare()通常是在子线程中使用没有绑定Looper的handler时出现,只需在handler语句的前后加Looper.prepare()和Looper.loop()方法即可。 即:
//简单的创建一个新线程
new Thread(new Runnable() {
@Override
public void run() {
Looper.perpare();
//运行部分的代码放在这一块
Looper.loop();
}
}).start();