研究了 线程超时方面的东西
基本思路
触发事件之后 同时开启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开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。 在下面的例子中使用了java 中的Timer类,对线程进行了约束,...
在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...
### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...
ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...
.net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...
在Android开发中,多线程是必不可少的一部分,特别是在处理耗时任务时,如网络请求、数据库操作或大计算量的任务。本示例“android 线程暂停/恢复/退出demo”将帮助开发者理解如何在Android环境中有效地控制线程的...
在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...
Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制
在Android系统中,线程消息机制是一个核心概念,它确保了应用程序的高效运行和用户体验的流畅性。这个机制主要由三部分组成:Handler、Looper和Message Queue。下面我们将从现实生活中的例子来深入理解这个机制,并...
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...
在Java编程中,控制程序执行超时是一项关键任务,特别是在多线程环境下,我们需要确保某个任务不会无限期地运行,导致资源浪费或者阻塞其他重要任务。本篇将深入探讨如何利用Java的线程和定时器(Timer)来实现这个...
本篇文章将深入探讨如何在Delphi中判断线程的状态,并提供相关的示例代码。 1. **线程状态** Delphi中的线程状态主要有以下几个: - **创建(Created)**:线程被创建但尚未开始执行。 - **就绪(Ready)**:...
Java中实现线程的超时中断方法实例 概述:在 Java 中实现线程的超时中断是非常重要的,特别是在熔断降级组件中。熔断降级组件需要在指定的超时时间内中断请求线程,以避免请求长时间阻塞系统资源。在这篇文章中,...
线程在Android中扮演着处理后台任务的重要角色,它可以避免因为长时间运行操作而阻塞主线程,确保UI的流畅性。 首先,我们需要理解Android的线程模型。主线程,也被称为UI线程,负责处理所有的用户交互,如触摸事件...
在Android开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行,尤其是在处理耗时操作如网络请求、数据加载等场景。本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很...
在Android开发中,数据的加载和处理经常涉及到线程的使用。本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、...
在Android开发中,线程管理是一项至关重要的技能,因为它直接影响到应用的性能和用户体验。本文将深入探讨Android线程的概念、类型以及如何有效地利用线程进行编程,包括各种经典用法,并提供完整的代码示例。 一、...
此外,考虑到"代码通俗易懂"的特点,这个记事本应用的源码可能包含了清晰的注释和逻辑结构,便于初学者理解和学习。开发者可能会使用Adapter将数据库中的数据绑定到ListView或者RecyclerView上,以便在界面上显示...
这些库支持设置连接超时、读取超时,以及处理重定向、缓存策略等,是实现多线程下载的基础。 5. **断点续传**: 实现多线程下载时,为了应对网络不稳定或设备中断等情况,需要支持断点续传。这需要保存每个线程...