【Android】高版本访问网络失败问题,解决方法整合

各种报错问题,集合解决办法

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的文件夹

【Android】高版本访问网络失败问题,解决方法整合_第1张图片

 新建一个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地址来使用。

【Android】高版本访问网络失败问题,解决方法整合_第2张图片


方法六:

谷歌在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();

你可能感兴趣的:(Android,android-studio,android,tomcat,java)