安卓访问网络超时闪退? 安卓如何访问网络?求解

使用HttpURLConnection发送请求获取返回数据,网络连接请求超时会发生闪退。

可能的原因有两种

  1. 返回的网络连接为空,后续通过该连接调用获取返回码或者获取返回数据等方法时会发生空指针错误造成程序闪退。
  2. 用户连续请求用户导致等待访问的线程积累很多,如果十秒等不到反应,系统会认定该APP进程是僵尸进程,直接干掉也会导致闪退。

解决方法

写一个联网工具封装联网的操作,在这个操作中捕获超时异常,如果捕获到了提示用户网络超时,不要频繁请求。
当然如果用户硬要频繁请求,也没关系。关闭连接后返回一个空值,在访问网络子线程中判断,如果为空直接返回不再继续执行代码,关闭线程。

访问网络工具类的方法中捕获异常:
在这里插入图片描述
在访问网络子线程中调用了网络工具类中的发送请求的方法,如果返回的conn为空,直接返回,关闭子线程。
在这里插入图片描述

下面给出完整的联网工具类

package com.example.littlearrangement.Util;

import android.app.Activity;
import android.util.Log;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;

public class HTTPUtil {
    private static HttpURLConnection conn = null;
    // 使用http协议发送请求并获取返回数据,参数是请求的参数以及请求的服务
    public static HttpURLConnection sendDataByHttp(final Activity context, String data, String serve){
        try{
            // 1、生成URL对象
            String path = "http://xxx.abc.def/"+serve;
            URL url = new URL(path);
            // 2、生成连接对象
             conn = (HttpURLConnection)url.openConnection();
            // 3、设置请求方式 get表示获取数据;post表示提交数据
            conn.setRequestMethod("POST");
            // 4、设置超时信息、允许输入输出
            conn.setReadTimeout(4000);//设置超时信息
            conn.setConnectTimeout(4000);//设置超时信息
            conn.setDoInput(true);//设置输入流,允许输入
            conn.setDoOutput(true);//设置输出流,允许输出
            // 5、设置提交的参数,键值对形式,&隔开
            System.out.println(data); // 调试输出
            // 6、获取输出流
            OutputStream out = conn.getOutputStream();
            // 7、将提交的参数以字节形式写入输出流
            out.write(data.getBytes());
            out.flush();//刷新,将数据缓冲区中的数据全部输出,并清空缓冲区输出流并释放与流相关的资源
            out.close();//关闭

        } catch (ProtocolException e) {
            e.printStackTrace();
        }catch ( SocketTimeoutException e){  // 捕获网络访问超时异常,一旦捕获到就会返回空值
            e.printStackTrace();
            Log.v("login", "网络连接失败");
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show();
                }
            });
            conn.disconnect(); // 关闭连接
            return null;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

以及使用该工具类的一个实例

要注意,需要在子线程中访问网络,因为访问网络是费时操作

// 访问网络
new Thread(new Runnable() {
    @Override
    public void run() {
        String data = "action=add&from=android&name="+user.getUserName()+"&content="+context+"&type="+importance;
        Log.v("login", data);
        HttpURLConnection conn = HTTPUtil.sendDataByHttp(AddToDoListActivity.this, data, "todolist");
        if (conn == null){ // 网络连接失败,返回
            return;
        }
        try{ // 访问成功
            // 8、获取http状态返回代码,200表示成功
            int code = conn.getResponseCode();
            // 9、成功处理,获取输入流
            if (code == 200){
                Log.v("login","成功处理");
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                    Log.v("login", "读到了数据:"+response.toString());
                    if (response.toString().equals("添加成功")){
                        Log.v("login","添加成功:"+code);
                    }else{
                        Log.v("login", "添加失败");
                    }
                }
                conn.disconnect();
            }else{
                Log.v("login","返回错误码:"+code);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}).start();

在这里插入图片描述

经过几次测试,使用上述方法有不妥的地方:
1、必须是IP地址
2、不是因为手机没有联网导致的连接超时
原因如下:
1、如果使用的域名地址,访问不到的话,会报下述异常:在这里插入图片描述
这个异常发生在使用conn调用getResponseCode的时候
在这里插入图片描述

2、如果是本机没联网会报下面这个异常而不是SocketTimeoutException
未知主机异常
努力搜寻了很久还是没有什么收获,没能捕获到超时异常,最后只能通过捕获IOException达到了目的:在这里插入图片描述
希望有好心人指导,该怎么捕获访问特殊网络超时的异常。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解决Android Studio中的连接超时错误可以尝试以下方法: 1. 检查网络连接:确保你的网络连接正常,可以尝试使用其他网络或者重启网络设备。 2. 检查防火墙设置:防火墙可能会阻止Android Studio与Gradle服务器的连接。请确保防火墙允许Android Studio访问网络。 3. 更改Gradle版本:尝试更改项目中的Gradle版本。可以在项目的build.gradle文件中修改Gradle版本号,然后重新同步项目。 4. 使用代理服务器:如果你在使用代理服务器,请确保Android Studio的代理设置正确。可以在Android Studio的设置中找到代理设置,并根据你的代理服务器配置进行相应的设置。 5. 清除Gradle缓存:有时候Gradle缓存可能会导致连接超时错误。可以尝试清除Gradle缓存并重新同步项目。可以在Android Studio的设置中找到Gradle设置,然后点击"清除"按钮来清除缓存。 6. 更新Android Studio和Gradle:确保你使用的是最新版本的Android Studio和Gradle。可以在Android Studio的设置中检查更新,并按照提示进行更新。 7. 检查代理设置:如果你使用了代理服务器,请确保代理设置正确。可以在Android Studio的设置中找到代理设置,并根据你的代理服务器配置进行相应的设置。 8. 重启Android Studio:有时候重启Android Studio可以解决连接超时错误。尝试关闭Android Studio并重新打开。 希望以上方法能够帮助你解决连接超时错误。如果问题仍然存在,请提供更多详细信息以便进一步帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值