0

我有适用于 api lvl 8 和 9 的文件发件人代码。但是当我将 target-api lvl 更改为 16 或 17 时,它会出错并且程序直接关闭。当我删除 <"android:targetSdkVersion=.."> 属性时,它可以工作。但我需要将该属性写为 16 或 17 lvl。我需要工作 16 或 17 api lvls。(我的 nexus 7 版本 4.2.2(api lvl 17),我将为 USB 应用程序使用一些 16/17 api lvl 属性)

这是工作发送文件代码:

SendButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                    Socket sock = new Socket("192.168.2.7",5656); 
                    File myFile = new File ("/mnt/sdcard/TEST/TEST.xml");
                    byte [] mybytearray  = new byte [(int)myFile.length()];
                    FileInputStream fis = new FileInputStream(myFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    bis.read(mybytearray,0,mybytearray.length);
                    OutputStream os = sock.getOutputStream();
                    os.write(mybytearray,0,mybytearray.length);
                    os.flush();
                    sock.close();
                }   
            catch (IOException e) {
            }   
        }
    });

这是我的 Android Manifest 文件版本和权限:

    android:minSdkVersion="8"
    android:targetSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

代码就是这样工作的。但我需要更改 android:targetSdkVersion="16 或 17"。

关于该问题的任何想法解决方案以及如何为我的 Nexus7 解决它?

4

1 回答 1

1

因为如果你使用更高版本的 API 在 UI Thread 中处理来自 Network 的数据,它会抛出异常(NetworkOnMainThreadException)。所以你必须在工作线程中处理网络数据:

public void onClick(View v) {
      new Thread(new Runnable() {
            public void run() {    
                try { 
                    Socket sock = new Socket("192.168.2.7",5656); 
                    File myFile = new File ("/mnt/sdcard/TEST/TEST.xml");
                    byte [] mybytearray  = new byte [(int)myFile.length()];
                    FileInputStream fis = new FileInputStream(myFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    bis.read(mybytearray,0,mybytearray.length);
                    OutputStream os = sock.getOutputStream();
                    os.write(mybytearray,0,mybytearray.length);
                    os.flush();
                    sock.close();
                }catch (IOException e) {
                } 
             }
          }).start();
      }

您可以在http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html中查看更多详细信息

它是在 API 11 中添加的。

于 2013-05-02T06:47:55.260 回答