`
44289533
  • 浏览: 68385 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android 线程判断超时 通俗易懂!

阅读更多
研究了 线程超时方面的东西
基本思路
触发事件之后 同时开启2个线程
   1-timer线程
   2-执行数据访问的thread线程
   3-Runnable线程 此线程用来更新UI
   timer线程设置CHECK_TIME秒之后执行,也就是访问的最大时间 超过此时间就视为超时
那么我们应该考虑的就是超时 和 不超时的处理
    假如超时--
        也就是说 timer已经执行了,那我们就应该把 thread线程停止掉 安全起见我用个boolean值进行限制。然后再thread线程内判断此boolean值 是否继续下面的操作。
    假如正常--
        当thread线程访问正常速度在5秒之内,也就是说thread赶在 timer之前执行完毕了,那就按照我们正常的思路来写程序,当然别忘了把timer停止掉
  

	public void onScanReady(final String jan) {
		isTimeOut = false;
//		Log.d("#", "onScanReady  > ");
		showWaitDialogNoTitle(getString(R.string.MSG_I_0004));
		final Runnable mUpdateResults = new Runnable() {
			public void run() {
				if (isTimeOut) {
//超时操作
				} else {
					initListView(jan);
				}
			}
		};
		// //////////
		if (thread != null) {
			thread.stop();
		}
		timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
//				Log.d("#", "timer out 1> ");
				// 若5秒之后执行了这个 说明已经超时 在访问数据库的线程里面关闭此timer
				isTimeOut = true;
				if (thread != null) {//停掉数据访问线程
					thread.stop();
				}
				uiHandler.post(mUpdateResults);//更新UI
//				Log.d("#", "timer out 2> ");
			}
		}, CHECK_TIME);
//		Log.d("#", "start thread > ");
		thread = new Thread(new Runnable() {
			@Override
			public void run() {
				Looper.prepare();
				try {
					list = countListBll.getAllByJan(handler, jan);//数据访问操作
					if (!isTimeOut) {
						uiHandler.post(mUpdateResults); // call updateUI thread
						timer.cancel();
//						Log.d("#", "         success > ");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
                        Looper.loop();
			}
		});
		thread.start();
	}


下面是 用了两个thread 一个是守护线程 另一个是查询线程
用Thread.run() 两个方法不会同时运行 需要用start()方法
@Override
	public void onScanReady(String jan) {
		if (jan.replaceFirst("^0*", "").length() >= 13) {
			jan = jan.replaceFirst("^0*", "").substring(0, 13);
		}
		//判断jan
		if(!countListBll.checkProductCD(jan)){
			showAlertDialog_OK(getString(R.string.MESSAGE_CODE_U0015),
					getString(R.string.MSG_COMMON_YES),null);
			return; 
		}
		final String productCD=jan;
		Log.i(LOG_TAG,"CountConfirmList > onScanReady() > ProductCD:"+productCD);
		Boolean isNetwork = Utility
				.isNetworkAvailable(InventoryCountConfirm_ListActivity.this);
		if (isNetwork) {
			isTimeOut = false;
			showWaitDialogNoTitle(getString(R.string.MSG_I_0004));
			final Runnable mUpdateResults = new Runnable() {
				public void run() {
					if (isTimeOut) {
						String msg = getString(R.string.MESSAGE_CODE_U0014);
						String okStr = getString(R.string.MSG_COMMON_OK);
						showAlertDialog_OK(msg, okStr, null);
					} else {
						initListView();
					}
				}
			};
			if (thread != null) {
				thread.stop();
			}
			checkThread=new Thread(new Runnable() {
				
				@Override
				public void run() {
					try {
						Log.e("====", " checkThread >>>");
						Thread.sleep(5000);
						Log.e("====", " isTimeOut >>>");
						if (thread != null) {
							thread.stop();
							isTimeOut = true;
						}
						Log.i(LOG_TAG,"CountConfirmList > onScanReady() > TimeOut");
						uiHandler.post(mUpdateResults);//Ui update
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
			checkThread.setDaemon(true);
			checkThread.start();
			thread = new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						Log.e("====", " thread >>>");
						list = countListBll.getAllByJan(handler, productCD);//
//						Thread.sleep(6000);
						if (!isTimeOut) {
							uiHandler.post(mUpdateResults); // call updateUI thread
//							timer.cancel();
							if (checkThread!=null) {
								checkThread.interrupt();
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
			thread.start();
		}else{
			 String msg = getString(R.string.MSG_E_0003);
			 String okStr = getString(R.string.MSG_COMMON_OK);
			 showAlertDialog_OK(msg, okStr, null);
		}
	}
分享到:
评论

相关推荐

    安卓,Android线程网络超时自动终止

    Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。 在下面的例子中使用了java 中的Timer类,对线程进行了约束,...

    Android线程结束——合理的结束你想结束的线程

    在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...

    浅谈android线程模型

    ### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...

    vb.net C#线程锁超时控制代码

    ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...

    .net c#线程超时解决方案

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    android 线程暂停/恢复/退出demo

    在Android开发中,多线程是必不可少的一部分,特别是在处理耗时任务时,如网络请求、数据库操作或大计算量的任务。本示例“android 线程暂停/恢复/退出demo”将帮助开发者理解如何在Android环境中有效地控制线程的...

    Android多线程文件上传

    在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...

    Android线程间通信的Message机制

    Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制

    从现实生活中理解android 线程消息机制

    在Android系统中,线程消息机制是一个核心概念,它确保了应用程序的高效运行和用户体验的流畅性。这个机制主要由三部分组成:Handler、Looper和Message Queue。下面我们将从现实生活中的例子来深入理解这个机制,并...

    Android 中三种启用线程的方法总结

    首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...

    java通过线程控制程序执行超时

    在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...

    delphi判断线程状态

    本篇文章将深入探讨如何在Delphi中判断线程的状态,并提供相关的示例代码。 1. **线程状态** Delphi中的线程状态主要有以下几个: - **创建(Created)**:线程被创建但尚未开始执行。 - **就绪(Ready)**:...

    Java中实现线程的超时中断方法实例

    Java中实现线程的超时中断方法实例 概述:在 Java 中实现线程的超时中断是非常重要的,特别是在熔断降级组件中。熔断降级组件需要在指定的超时时间内中断请求线程,以避免请求长时间阻塞系统资源。在这篇文章中,...

    Android----线程实现图片移动

    线程在Android中扮演着处理后台任务的重要角色,它可以避免因为长时间运行操作而阻塞主线程,确保UI的流畅性。 首先,我们需要理解Android的线程模型。主线程,也被称为UI线程,负责处理所有的用户交互,如触摸事件...

    android多线程demo(很清晰很详细)

    在Android开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行,尤其是在处理耗时操作如网络请求、数据加载等场景。本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很...

    android 单线程 多线程下载

    在Android开发中,数据的加载和处理经常涉及到线程的使用。本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、...

    android 线程详解 各种经典 完整代码

    在Android开发中,线程管理是一项至关重要的技能,因为它直接影响到应用的性能和用户体验。本文将深入探讨Android线程的概念、类型以及如何有效地利用线程进行编程,包括各种经典用法,并提供完整的代码示例。 一、...

    Android写的记事本 主要用了数据库 代码通俗易懂

    此外,考虑到"代码通俗易懂"的特点,这个记事本应用的源码可能包含了清晰的注释和逻辑结构,便于初学者理解和学习。开发者可能会使用Adapter将数据库中的数据绑定到ListView或者RecyclerView上,以便在界面上显示...

    Android实现多线程下载

    这些库支持设置连接超时、读取超时,以及处理重定向、缓存策略等,是实现多线程下载的基础。 5. **断点续传**: 实现多线程下载时,为了应对网络不稳定或设备中断等情况,需要支持断点续传。这需要保存每个线程...

Global site tag (gtag.js) - Google Analytics