简体   繁体   English

Nexus 7在android api lvl 16和17上打开套接字会崩溃吗?

[英]Nexus 7 Opening a Socket at android api lvl 16 and 17 gives crash?

I have file sender code which works on api lvl 8 and 9. But when i changed the target-api lvl as 16 or 17 it gives error and program closes directly. 我有适用于api lvl 8和9的文件发送器代码。但是,当我将target-api lvl更改为16或17时,它给出了错误,程序直接关闭。 When i remove <"android:targetSdkVersion=.."> property it works. 当我删除<“ android:targetSdkVersion = ..”>属性时,它可以工作。 But i need to write that property as 16 or 17 lvl. 但我需要将该属性写为16或17 lvl。 I need to work 16 or 17 api lvls. 我需要工作16或17个API。 (My nexus 7 version 4.2.2 (api lvl 17) and i will use some 16/17 api lvl properties for usb applications) (我的nexus 7版本4.2.2(api lvl 17),我将为USB应用程序使用一些16/17 api lvl属性)

Here is the working send file code: 这是有效的发送文件代码:

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

Here is the my Android Manifest file versions and permissions: 这是我的Android清单文件的版本和权限:

    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" />

Code works like that. 代码就是这样。 But i need to change android:targetSdkVersion="16 or 17". 但是我需要更改android:targetSdkVersion =“ 16或17”。

Any idea solution about that problem and how can i fix it for my Nexus7 ? 关于该问题的任何创意解决方案,如何为Nexus7修复?

Because if you handle the data from Network in UI Thread with higher version API, it will throw an exception(NetworkOnMainThreadException). 因为如果您使用更高版本的API在UI线程中处理来自网络的数据,则它将引发异常(NetworkOnMainThreadException)。 So you have to handle the network data in work thread: 因此,您必须在工作线程中处理网络数据:

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

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

it was added in API 11. 它是在API 11中添加的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM