Android网络请求超时处理

本文介绍了两种Android网络请求超时处理方法:一是利用AsyncTask类的execute().get(timeout, unit)方法设置请求超时时间;二是通过自定义TimerTask和Handler实现更复杂的超时逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.cnblogs.com/tony-yang-flutter/p/androidtimeout.html

以用户登录为例介绍用户访问网络时的请求超时处理的两种方法:

一. 使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, unit);方法用于处理用户的请求超时的操作,可以设置请求超时的时间(timeout)以及请求时间的单位(unit)。

  例如:设置超时时间为2秒,单位为毫秒

try {
            AsyncTask(此处应该是它的实例化对象).execute().get(2000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
                        e.printStackTrace();
        } catch (ExecutionException e) {
                                        e.printStackTrace();
        } catch (TimeoutException e) {
            //此处用来处理用户超时后的操作,例如:跳转界面,弹出提示框。
            //备注:此处不能直接进行界面操作,否则回报ANR异常。如果相处理界面操作,则和handler进行结合
        }        
二. 第二种方法相对来说就比较复杂了,你需要自定义请求超时操作

1)自定义一个TimerTask,用于向handler发送请求超时消息

class MyTimerTask extends TimerTask{

        @Override
        public void run() {
            handler.sendEmptyMessage(5000);
        }
        
    }

2)定义一个设置请求超时的方法,超时时间为5秒

复制代码
    private void checkTimeOut(){
        try{
            timer = new Timer();
            task = new MyTimerTask();
            timer.schedule(task, 5000);
        }catch(Exception e){
            Log.e("timer", e.getMessage());
        }
    }

3)开发登录线程

复制代码
    private class LoginThread extends Thread{
        @Override
        public void run() {
            try{
                try {
                    checkTimeOut();
                    //下面用于编写请求网络数据的代码
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                handler.sendEmptyMessage(5000);
            }catch(Exception e){
                Log.e("LoginThread", e.getMessage());
            }
        }
    }

4)在handler中处理请求超时或者请求成功的操作

复制代码
    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch(msg.what){
            case 5000:
                //关掉timer
                timer.cancel();
                //处理请求超时时要做的操作
                break;
            }
        };
    };


每天进步一点点!


Android网络请求超时过渡动画可以通过属性动画来实现。当网络请求超时时,可以使用补间动画对某个View进行一系列的动画操作,例如淡入淡出、缩放、平移等,以提供用户一个过渡效果,让用户知道网络请求正在进行中。同时,可以使用帧动画来展示一个loading的动画效果,让用户知道应用正在等待网络请求的结果。\[1\] 如果在使用Glide加载图片时出现问题,可以通过查看Glide的日志来进行排查。可以通过adb命令开启Glide的日志,并关注请求的日志和图片加载/转换的日志,以便找到问题所在并进行解决。\[2\] 在Android系统中,显示开机动画主要由系统服务SurfaceFlinger来完成。应用程序bootanimation负责显示开机动画,并在启动脚本init.rc中被配置成一个服务。当SurfaceFlinger服务启动时,它会通过修改系统属性ctl.start的值来通知init进程启动应用程序bootanimation,以便显示开机动画。当系统中的关键服务都启动起来后,ActivityManagerService服务会通知SurfaceFlinger服务来修改系统属性ctl.stop的值,以便通知init进程停止执行应用程序bootanimation。\[3\] #### 引用[.reference_title] - *1* *3* [Android 各大厂面试题汇总与详解(持续更新)](https://blog.youkuaiyun.com/qq36246172/article/details/129969747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [android glide 版本,Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法](https://blog.youkuaiyun.com/weixin_36151066/article/details/117495727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值