1

我正在使用 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)

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

在 exception 之前提到这个可能很有用,我得到了这个异常:

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 设备的通信。

4

3 回答 3

1

创建文件时可以不使用getFilesDir()传递目录路径吗

于 2013-11-17T06:59:44.003 回答
1

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

我认为解决这些问题将解决您的问题。

于 2013-11-17T06:55:07.830 回答
1
public class L {

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

    public  synchronized void log(String message){        

       ....

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

于 2013-11-24T06:44:28.883 回答