UsbHost模式下的TransactionTooLargeException

时间:2013-11-09 15:10:22

标签: android exception

我正在使用usb-serial-for-android库,我得到了一些奇怪的结果。在与串口连续通信2.5小时并成功读写之后,我得到了这个例外:

exception in UsbManager.openDevice
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.hardware.usb.IUsbManager$Stub$Proxy.openDevice(IUsbManager.java:339)
at android.hardware.usb.UsbManager.openDevice(UsbManager.java:255)
at com.hoho.android.usbserial.driver.UsbSerialProber$1.probe(UsbSerialProber.java:63)
at com.hoho.android.usbserial.driver.UsbSerialProber.probeSingleDevice(UsbSerialProber.java:174)

但是当我强制关闭我的应用程序然后重新启动它时,一切都很好,我的应用程序可以再次与端口通信。

在异常之前提到它可能有用,我得到了这个例外:

java.io.FileNotFoundException: /sdcard/log.txt: open failed: EMFILE (Too many open files)
at libcore.io.IoBridge.open(IoBridge.java:406)
at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
at java.io.FileWriter.<init>(FileWriter.java:58)
at org.example.myapp.util.L.log(L.java:32)

我使用类L进行日志记录:

public class L {

    public  synchronized void log(String message){

        File logFile = new File("sdcard/log.txt");
           if (!logFile.exists())
           {
              try
              {
                 logFile.createNewFile();
              } 
              catch (IOException e)
              {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
              }
           }
           try
           {
              //BufferedWriter for performance, true to set append to file flag
              BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
              buf.append(new Date(DateProvider.getInstance().getCurrentDateAsMillisecs()).toString()+": "+message);
              buf.newLine();
              buf.close();
           }
           catch (IOException e)
           {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
    }

}

似乎某种缓冲区或缓存已被填满并阻止与设备通信。

如何摆脱异常?

更新

即使我收到异常,写入日志文件也不会失败。它只影响与USB设备的通信。

3 个答案:

答案 0 :(得分:1)

您正在打开太多文件。 我发现的问题:
  - 你永远不会关闭logFile
  - 你在日志函数中打开文件,静态文件会更好,可以在log_init()中初始化;功能。
或者,使logFile成为对象变量并在构造函数中初始化它。

我认为解决这些问题可以解决你的问题。

答案 1 :(得分:1)

创建文件

时,是否可以使用getFilesDir()传递目录路径

答案 2 :(得分:1)

public class L {

    public static File logFile = new File("sdcard/log.txt");

    public  synchronized void log(String message){        

       ....

每次调用新文件时,都会从系统请求文件资源。当你继续这样做时,系统会抱怨你打开了太多文件。为避免这种情况,请仅请求文件一次。