`
isiqi
  • 浏览: 16745841 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

android发送模拟按键消息,出现死锁,timeout的解决方法

阅读更多

最近在状态栏上面添加了一些系统常用的按键,用的比较多的,Home, Menu, Back三个按键,

分别模拟物理按键按下时的消息,

参考下面两篇文章,可以实现在状态栏上添加自定义的按键,

1.

在android的状态栏(statusbar)中增加menu,home和back快捷键的方法

http://blogold.chinaunix.net/u2/78893/showart_2349971.html

2.

在android的状态栏(statusbar)中增加menu,home和back快捷键的方法,及按键延迟原因分析

http://hi.baidu.com/tigerpan/blog/item/63caae81b57580b16c811937.html

但是在状态栏上面点击按钮的时候,却经常出现死锁,假死的情况,在第二篇文章的时候,提到,

我们先看一下执行流程
在com.android.server.WindowManagerService.injectKeyEvent(KeyEvent, boolean)函数中我们可以看到实际上是调用dispatchKey(newEvent, pid, uid)函数,这个dispatchKey函数中:

需要先找到当前的焦点focusObj(focusObj:WindowState 就是在维护窗口ViewRoot与WindowManagerService之前的关联,这二者的通信都在WindowState中可以找到);再用focusObj把KeyEvent传递给当前焦点窗口。但在传递之前会先调用mKeyWaiter.waitForNextEventTarget()函数等待当前焦点处理完上一次事件(这包括KeyEvent,MotionEvent...等),如何判断是否处理完上一次事件, 用if (mFinished && !mDisplayFrozen) if (targetWin != null)这两个if语句判断,而最关键就是这个mFinished ,这里还得查看ViewRoot,在ViewRoot中分发事件后会调用sWindowSession.finishKey(mWindow);告诉WindowManagerService,在doFinishedKeyLocked()函数中将mFinished = true,如果mFinished不为true,则会wait(curTimeout),这就是出现停顿的直接原因

通过打印Log显示是我们的KeyEvent.Action_Down事件一直不能mFinished,这就要跟踪ViewRoot,发现每次在模拟的KeyEvent.Action_Down事件的Message根本不能被处理,原因是StatusBarView的TouchEvent没有处理完成,并且与模拟的KeyEvent.Action_Down事件在MessageQueue的next函数中卡住了而ViewRoot本身就是一个Handler,大量的Message从此经过,而StatusBar的ViewRoot既要处理Touch事件也要处理模拟按键,就出现了这种竞态死锁的现象。

延迟发送模拟的KeyEvent是我目前采用的解决方式,上面的例子中sendKey函数已经体现

大概就是按键点击的时候(我自己个人理解),如果在onClick事件里面立刻直接发送KeyEvent的话,会导致onClick的消息处理无法正常返回,从而导致后面的消息也无法被获取处理,这是产生假死停顿的原因,所以参考上面的方法,新创建一个线程,延时发送KeyEvent(我直接用文2的方法问题也没有得到很好的解决).

分享到:
评论

相关推荐

    ORACLE表死锁的解决方法亲测有效!

    本文将深入探讨ORACLE表死锁的成因、检测与解决方法,基于实际测试经验分享有效的解决方案。 ### ORACLE表死锁的成因 死锁通常发生在多个事务同时对同一资源进行互斥访问的情况下。具体而言,当一个事务请求锁定一...

    通过Android trace文件分析死锁ANR实例过程

    本文将通过一个具体的死锁导致的ANR实例,解析如何利用Android trace文件来分析和解决这类问题。 当Android系统检测到ANR发生时,会在/data/anr/目录下自动生成一个trace文件,其中包含了系统运行时的详细信息,如...

    java模拟线程死锁

    Java 模拟线程死锁 线程死锁 在 Java 中,线程死锁(Deadlock)是一种特殊的情况,发生在两个或多个线程之间的互相等待对方释放资源的状态。这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他...

    模拟银行家算法实现死锁避免

    操作系统中的死锁问题一直是一个重要的研究领域,而模拟银行家算法是解决这一问题的一种有效方法。这个算法由艾兹格·迪杰斯特拉提出,它借鉴了银行贷款系统的概念,通过对资源分配进行预检查,来避免系统进入死锁...

    数据库死锁-解决死锁问题的三种办法

    总之,解决数据库死锁问题的三种方法各有优缺点,实际应用中应根据具体情况和需求选择最适合的策略。预防死锁虽能有效避免死锁的发生,但可能限制了资源的利用率;检测死锁虽然灵活性较高,但可能会增加系统的复杂性...

    db2死锁问题分析及解决方案

    本文将详细探讨DB2中死锁问题的分析方法及有效的解决方案,并提供具体的步骤和技术指导。 #### 二、死锁的基本概念 死锁是指两个或多个事务因互相等待对方释放资源而无限期地阻塞下去的情况。在DB2中,当两个或多个...

    oracle数据库解决死锁

    Oracle数据库解决死锁是指在Oracle数据库中出现的死锁问题,通过使用PL/SQL语句手动解决死锁问题。死锁是当多个事务在等待其他事务释放资源时,导致系统无法继续执行的现象。 在Oracle数据库中,死锁可能是由多种...

    DB2解决表死锁

    总的来说,理解并掌握DB2中死锁的原理、预防和解决方法,对于保证数据库系统的稳定运行至关重要。通过持续监控、优化事务处理和数据库配置,我们可以有效地减少和解决DB2的死锁问题。在实践中,应结合具体的业务场景...

    课程设计-模拟银行家算法避免死锁.doc

    银行家算法是一种避免死锁的方法,它可以使系统状态分为安全状态和不安全状态,避免死锁的产生。 银行家算法的数据结构 银行家算法使用了四种数据结构:可利用资源向量 Available、最大需求矩阵 Max、分配矩阵 ...

    SQL Server死锁的解除方法

    "SQL Server死锁的解除方法" SQL Server死锁是指在多个事务之间的资源竞争时,出现的循环等待资源的现象。死锁会导致系统性能下降,甚至会导致系统崩溃。因此,解决SQL Server死锁是非常重要的。 SQL Server死锁的...

    SQL Server死锁产生的原因及解决办法

    此外,SQL Server自带的死锁检测机制也会自动发现并解决死锁,但这种方法并不能完全预防死锁。 6. **合理设计索引**:优化索引可以提高查询效率,减少锁定时间,从而降低死锁发生的可能性。 7. **使用更细粒度的...

    解决STM32 I2C接口死锁的方法讨论

    ### 解决STM32 I2C接口死锁的方法讨论 #### 一、问题背景与现象 在使用STM32微控制器进行嵌入式系统开发的过程中,I2C接口的稳定性和可靠性至关重要。然而,STM32的I2C接口有时会出现总线锁死的情况,即所谓的...

    模拟死锁过程

    对于死锁的一个充分模拟技术,能够模拟死锁的问题而写

    实测有效的一个c++检测线程死锁的解决方法(实现和测试代码)

    实测有效的一个c++检测线程死锁的解决方法(实现和测试代码) 原创实测有效的一个c++检测线程死锁的解决方法,已应用于项目,实测有效 原创文章地址:https://blog.csdn.net/liaozhilong88/article/details/80354414...

    操作系统实验报告--模拟死锁避免程序

    ### 操作系统实验报告知识点详解 #### 实验背景与目的 ...此外,实验还涉及到了如何设计合理的输入输出接口以及如何有效处理用户输入等问题,这对于提高学生的编程能力和问题解决能力具有重要意义。

    解决死锁方法

    "解决死锁方法" 死锁是SQL Server中常见的问题之一,它会导致数据库性能下降、甚至数据库崩溃。因此,了解如何查询和解决死锁是非常重要的。本节将为您介绍如何查询SQL Server死锁,并提供解决死锁的方法。 死锁的...

    此次课程设计的主要内容是模拟实现资源分配。同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

    - 相比之下,随机分配算法可能无法保证系统的安全性,导致出现死锁的情况。 - **结论**: - 银行家算法在预防死锁方面表现更佳。 - 随机分配算法虽然简单,但在实际应用中可能存在较大风险。 ### 四、代码实现...

    mysql死锁解决

    #### 四、解决死锁的方法 1. **优化SQL语句**:尽可能地减少事务中涉及的表和行数量,避免复杂的SQL查询。 2. **加锁顺序**:对同一个数据对象操作时,按照固定的顺序进行加锁。 3. **设置合理的超时时间**:为事务...

    Java源码房门终于被打开了(解决死锁的方法).rar

    Java编程语言以其强大的功能和...通过阅读"说明.txt"和"房门终于被打开了(解决死锁的方法)"这两个文件,我们可以更深入地理解死锁的本质,学习如何在实际项目中避免和解决死锁,从而提高多线程程序的健壮性和效率。

    模拟银行家算法解决死锁问题的C程序

    《模拟银行家算法解决死锁问题的C程序》 在操作系统的设计与实现中,死锁是需要重点关注的问题。死锁是指多个并发进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。...

Global site tag (gtag.js) - Google Analytics