3

usbmanager クラスを使用して、Android 4.1.1 マシンで USB ホストを管理しています。(~ 900 のトランザクションの後) デバイスのオープンに失敗し、例外なく null を返すまで、すべてが数百のトランザクションに対して非常にうまく機能しているようです。プロファイラーを使用すると、メモリリークの問題ではないようです。

これは、メイン アクティビティからの通信を初期化する方法です (これを 1 回実行します)。

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);
}
4

2 に答える 2

0

コードで1回しか開いていないにもかかわらず、Android 4.0で繰り返し実行するとopendeviceが失敗しました。リソースを閉じない出口パスがいくつかあり、OS がプロセスの終了時にそれを解放すると想定していました。

ただし、プロセス終了時のリソースの解放に問題があるようです。以前は、プロセスを終了して新しいプロセスを起動したときでも問題がありました。
最後に、終了時にリソースを確実に解放し、問題を解決しました。

于 2013-07-01T07:37:32.483 に答える