调试Android USB遇到的令人费解的问题
上周参照网上代码,做了USB的初步探测程序,工作正常 。今天从硬件部拿到了一段例程,原本打算参考它来完善自己的程序。但运行之后总是报错,逐步跟进错误,进而发现了一个匪疑所思的问题。调试一天也未发现原因以及解决办法。在此做记录,留待以后解决或从网上得到帮助。
问题程序:
UsbHid.java:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class UsbHid extends Activity{
private static UsbHid usbHid = null;
Context context;
private static final String TAG = "UsbHid";
private UsbManager myUsbManager;
private UsbDevice myUsbDevice;
private boolean HasUsbDevice;
...
private UsbHid(Context context) {
this.context = context;
myUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
HasUsbDevice = enumerateDevice();
Log.d(TAG, "UsbHid init");
}
public bollean enumerateDevice() {
if (myUsbManager == null)
return -1;
HashMap<String, UsbDevice> deviceList = myUsbManager.getDeviceList();
if (!deviceList.isEmpty()) {
...
return true;
}
return false;
}
public static UsbHid getInstance(Context context) {
if (usbHid == null) {
usbHid = new UsbHid(context);
}
return usbHid;
}
public boolean getUsbDevice() {
return HasUsbDevice;
}
...
}
MainActivity.java:
public class MainActivity extends ActionBarActivity {
UsbHid usbHid = null;
UsbManager myUsbManager;
UsbDevice myUsbDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usbHid = UsbHid.getInstance(this);
if (usbHid.getUsbDevice()) {
usbHid.ConnectUsbHid();
this.setTitle("已连接USB设备");
} else {
this.setTitle("末检测到USB设备");
}
if (usbHid.getUsbDevice()) {
UsbReadThread thread = new UsbReadThread();
thread.start();
}
}
...
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
以上程序从原理上分析应该没有问题,但实际中deviceList.isEmpty()总是返回null。
更为奇怪的是,若将UsbHid.java中的
myUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
HasUsbDevice = enumerateDevice();
移到MainActivity.java中,则没有问题,可以正常枚举设备。
前一天写的以上内容,今天原本打算暂时绕过以上问题,继续进行后续开发,毕竟这个问题不是不可避免的。但还是觉得应该再基于这个问题研究一下,因为这样才能够提高水平,丰富经验。
进行反复修改尝试,根据现象判断,最终发现了问题所在:
UsbHid.java:
public static UsbHid getInstance(Context context) {
if (usbHid == null) {
usbHid = new UsbHid(context);
}
return usbHid;
}
就是这句导致的问题!将这句程序封掉后,可以枚举到设备,程序可以正常工作了。
具体原因尚不清楚,但初步分析应该是由于usbHid是静态变量(private static UsbHid usbHid = null;),放在全局存储区,因此回收的时候并没有马上释放掉。下次进程再启动时,它并不是null,而是上次一分配过的值。基于这个想法,做了实验,将上面这段代码改写如下:
public static UsbHid getInstance(Context context) {
if (usbHid == null) {
usbHid = new UsbHid(context);
return usbHid;
}
return null;
}
改写程序的目的是测试是否每次都返回usbHid而非null。宏观上从程序运行现象来看应该是如果每次都返回usbHid,则每次程序都正常;如果有返回null的时候,则程序会停止运行。
测试结果印证了 猜测,一次成功接一次失败,即确实usbHid在前一次进程结束后并未彻底释放,而直到出错被停止运行后才被释放掉。
另外一个测试也验证了以上想法:将手机重启,之后运行以上程序,由于是第一此运行,因此完全正常,而后每次即使不插入usb设备,也不报错。这就说明了usbHid这个变量并没有被释放干净。
至于为何进程结束后,仍不能是放干净,则有待进一步深入,应该是与Java的回收机制有关了……
调试Android USB遇到的令人费解的问题的更多相关文章
- Eclipse中调试Android技巧
Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...
- 在 Chrome 中调试 Android 浏览器
最近需要使用 Chrome Developer Tools 调试 Android 浏览器,但是官方指南并不是很好使,经过一番折腾,终于调试成功了,在此把经验分享给需要的朋友. Chrome Devel ...
- Web程序员开发App系列 - 调试Android和IOS手机代码(补图)
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- 在ubuntu下真机调试android程序出现设备没有访问权限
今天把android的开发环境从windows平台切换到了ubuntu上. java jdk android-adt android-ndk都下好,环境变量都配好之后, 在调试程序的时候,出现设备没有 ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- I.MX6 Android USB Touch eGTouchA.ini文件存放
/******************************************************************** * I.MX6 Android USB Touch eGTo ...
- 通过Wifi调试Android应用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- android usb Host模式下与usb Hid 设备的通信
做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...
- 如何通过Chrome远程调试android设备上的Web网站
网上的帖子很多,但很多都是老版本的,试过了,根本不管用,花了一天时间,终于在本机试验通过了,特记录下来,以备用.有需要的朋友也可以参考.先上一张图,看看PC端chrome上调试的效果: 左边是手机的模 ...
随机推荐
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumbe ...
- C#集合之Hashtable
Hashtable是一个键值对集合,其泛型版本是Dictionary<K, V>,下面说下常用的一些方法; 1.Add(),向Hashtable添加元素,需要注意的是因为它是键值对集合,所 ...
- HTML招聘简历解析
使用 jsoup 对 HTML 文档进行解析和操作 Jsoup解析html简历与dom4j解析xml是一个道理:首先必须知道html的格式,不知道格式,无法解析.根据格式,再将需要的内容通过下面的方法 ...
- CBQW ---分组表单展示
工作流审核表单后,将表单信息展示页面中. Rest读取展示 展示方式有2 一. CBQW内容查询, 通过CBQW内容查询.分别通过设置itemstyle和header xsl ...
- 392. Is Subsequence
392. Is Subsequence 水题,先是判断长度,长度t比s小,返回false,然后从左到右扫描t,然后同时扫描s,如果相同,s的index就往后拉一个,如果s的index等于s长度,返回t ...
- java 泛型 窜讲
一.为什么使用泛型 复用性:泛型的本质就是参数化类型,因而使用编写的泛型代码可以被许多不同类型的对象所复用. 安全性:在对类型Object引用的参数操作时,往往需要进行显式的强制类 ...
- [转]select模型的一种技巧运用-libevent
参见网址 http://www.cppblog.com/xvsdf100/archive/2013/12/10/204689.html
- HTML5入门篇
---- HTML5简介 HTML5 是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 ...
- jquery鼠标样式
浏览器是有自带的鼠标样式的,如果某些时候为了保持鼠标样式的统一,或者想指定特定的鼠标样式该怎么办呢?那就要使用自定义了,下面有个不错的示例,喜欢的朋友可以参考下 1.浏览器自带的鼠标样式: 2. ...
- [C#]判断字符串中是否包含中文
关键代码: /// <summary> /// 判断字符串中是否包含中文 /// </summary> /// <param name="str"&g ...