当前位置: 首页 > article >正文

Android 中线程网络超时的处理

Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。

在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。

import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity {

    private static final int TIME_OUT = 0;
    private static final int SUCCESS = 1;

    // 超时的时限为5秒
    private static final int TIME_LIMIT = 5000;
    private ProgressDialog proDialog;
    private Timer timer;
    private Thread threadTimeOut;
    private Button btn1, btn2;

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    btn1 = (Button) findViewById(R.id.button1);  
    btn2 = (Button) findViewById(R.id.button2);  
    // 测试未超时的线程,为btn1绑定事件  
    btn1.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) {  
            proDialog = ProgressDialog.show(MainActivity.this, "提示",  
                    "线程运行中");  
            // 匿名内部线程  
            threadTimeOut = new Thread() {  
                @Override  
                public void run() {  
                    while (true) {  
                        try {  
                            //线程休眠时间,超时  
                            sleep(10000);  
                        } catch (InterruptedException   e) {  
                            break;  
                        }  
                    }  

                }  
            };  
            thread.start();  
            // 设定定时器  
            timer = new Timer();  
            timer.schedule(new TimerTask() {  
                @Override  
                public void run() {  
                    sendTimeOutMsg();  
                }  
            }, TIME_LIMIT);  

        }  
    });  
    // 测试超时的线程,为btn2绑定事件  
    btn2.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) {  

            proDialog = ProgressDialog.show(MainActivity.this, "提示",  
                    "线程运行中");  
            // 匿名内部线程  
            thread = new Thread() {  
                public void run() {  
                    try {  
                        // 线程休眠时间,未超时  
                        Thread.sleep(3000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    Message msgSuc = new Message();  
                    msgSuc.what = SUCCESS;  
                    myHandler.sendMessage(msgSuc);  
                }  
            };  
            thread.start();  
            // 设定定时器  
            timer = new Timer();  
            timer.schedule(new TimerTask() {  
                @Override  
                public void run() {  
                    sendTimeOutMsg();  
                }  
            }, TIME_LIMIT);  
        }  
    });  
} 
private MyHandler myHandler = null;
    //Handler静态内部类
    private static class MyHandler extends Handler {
        //弱引用
        WeakReference<SceneryLightControlSingleFragment> weakReference;

        public MyHandler(SceneryLightControlSingleFragment activity) {
            weakReference = new WeakReference<SceneryLightControlSingleFragment>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            SceneryLightControlSingleFragment activity = weakReference.get();
            if (activity != null) {
                switch (msg.what) {
                     case TIME_OUT:  
            //打断线程  
            thread.interrupt();  
            proDialog.dismiss();  
            Toast.makeText(MainActivity.this, "线程超时", Toast.LENGTH_SHORT)  
                    .show();  
            break;  
        case SUCCESS:  
            //取消定时器  
            timer.cancel();  
            proDialog.dismiss();  
            Toast.makeText(MainActivity.this, "线程运行完成", Toast.LENGTH_SHORT)  
                    .show();  
            break;  
        default:  
            break;  
                }
            }
        }
    }
    
//向handler发送超时信息  
private void sendTimeOutMsg() {  
    Message timeOutMsg = new Message();  
    timeOutMsg.what = TIME_OUT;  
    myHandler.sendMessage(timeOutMsg);  
}  
 @Override
    public void onDestroy() {
        if(myHandler!= null) {
            myHandler.removeCallbacksAndMessages(null);
        }
        if(threadTimeOut != null){
            if(threadTimeOut.isAlive()){
                threadTimeOut.interrupt();
            }
        }
        super.onDestroy();
    }
} 

http://www.kler.cn/a/396656.html

相关文章:

  • Python学习从0到1 day26 第三阶段 Spark ④ 数据输出
  • MYSQL 精通索引【快速理解】
  • DAY65||Bellman_ford 队列优化算法(又名SPFA)|bellman_ford之判断负权回路|bellman_ford之单源有限最短路
  • web——sqliabs靶场——第六关——报错注入和布尔盲注
  • Android 中的 Zygote 和 Copy-on-Write 机制详解
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案
  • 缓存及其不一致
  • Yocto - 使用Yocto开发嵌入式Linux系统_13 创建定制层
  • 什么是 Go 语言?
  • 【计算机体系架构】 MESI缓冲一致性
  • 力扣每日一题 3261. 统计满足 K 约束的子字符串数量 II
  • DAY65||Bellman_ford 队列优化算法(又名SPFA)|bellman_ford之判断负权回路|bellman_ford之单源有限最短路
  • LogViewer NLog, Log4Net, Log4j 文本日志可视化
  • 安全见闻1-5
  • 分布式-事务
  • # 第20章 Cortex-M4-触摸屏
  • 深入理解AIGC背后的核心算法:GAN、Transformer与Diffusion Models
  • Python 正则表达式进阶用法:边界匹配
  • Spring boot 集成 nacos、redis、mysql
  • 软件设计师-软件工程
  • tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介
  • Spring——AOP
  • EasyExcel使用
  • Shell基础2
  • 嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)
  • 反转链表