我正在使用usbmanager类来管理我的android 4.1.1机器上的USB主机。 对于几百个事务似乎都很好,直到(在900次事务之后)打开设备失败,返回null无例外。 使用分析器似乎不是内存泄漏的问题。
这是我从主要活动初始化通信的方式(这样做一次):
public class MainTestActivity extends Activity {
private BroadcastReceiver m_UsbReceiver = null;
private PendingIntent mPermissionIntent = null;
UsbManager m_manager=null;
DeviceFactory m_factory = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
m_UsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) {
// call your method that cleans up and closes communication with the device
Log.v("BroadcastReceiver", "Device Detached");
}
}
}
};
registerReceiver(m_UsbReceiver, filter);
m_manager = (UsbManager) getSystemService(Context.USB_SERVICE);
m_factory = new DeviceFactory(this,mPermissionIntent);
}
这是我测试的代码:
ArrayList<DeviceInterface> devList = m_factory.getDevicesList();
if ( devList.size() > 0){
DeviceInterface devIf = devList.get(0);
UsbDeviceConnection connection;
try
{
connection = m_manager.openDevice(m_device);
}
catch (Exception e)
{
return null;
}
对于900到1000次调用,测试将正常工作,之后,以下调用将返回null(无例外):
UsbDeviceConnection connection;
try
{
connection = m_manager.openDevice(m_device);
}
答案 0 :(得分:8)
您可能只是用完文件句柄,典型的限制是每个进程1024个打开的文件。
尝试在close()
,see doc上调用UsbDeviceConnection
。
UsbDeviceConnection
对象已分配系统资源 - 例如文件描述符 - 仅在代码中的垃圾收集时释放。但在这种情况下,在内存不足之前就会耗尽资源 - 这意味着还没有调用垃圾收集器。
答案 1 :(得分:0)
我在Android 4.0上重复运行时遇到opendevice失败,即使我在我的代码中只打开一次。我有一些退出路径没有关闭资源,我假设操作系统会在进程终止时释放它。
然而,在流程终止时释放资源似乎存在一些问题 - 即使我终止并启动了新流程,我也会遇到问题。
我终于确保在退出时释放资源并使问题消失。