4

我制作了一个小应用程序,已经运行了几个月,但突然间我得到了一个

android.os.NetworkOnMainThreadException

我没有更改任何代码,这是崩溃的行

try {   
    endPoint = InetAddress.getByName(target.getToIp());
    port = target.getPort();
    socket = new DatagramSocket();
}
catch(Exception e) {
}

请注意,我没有发送任何东西,我只是在创建实例,它已经在 InetAddress 行上中断了。

昨晚一直戴着,我在手机上所做的只是在Google play上运行更新,它更新到最新版本的Google Maps,但这与它有什么关系吗?

它可以在模拟器中运行,只有我的 HTC One X 坏了

完整代码在这里 https://github.com/AndersMalmgren/FreePIE/tree/master/Lib/Android/FreePIE%20Android%20IMU

编辑:清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.freepie.android.imu"
    android:versionCode="1"
    android:versionName="1.0">  

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.INTERNET" /> 

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" 
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> 
    </application>

</manifest>

尝试将问题代码移至线程,现在它不会中断,但套接字设置为空。

running = true;
worker = new Thread(new Runnable() { 
    public void run(){
        try {   
            endPoint = InetAddress.getByName(target.getToIp());
            port = target.getPort();
            socket = new DatagramSocket();
        }
        catch(Exception e) {
            Exception err = e;
        }

        while(running) {
            try {
            sync.await();
            } catch(Exception e) {}

            Send();
        }
        try  {
            socket.disconnect();
        }
        catch(Exception e)  {}
    }
}); 
worker.start();

更新: 如果用户键入 DNS 而不是 IP,解决方案是添加一些故障回复 https://github.com/AndersMalmgren/FreePIE/commit/e8017e02a7893d9df41e4ed67a037f016b6a7d39

4

3 回答 3

5

NetworkOnMainThreadException如果您尝试在主应用程序线程上进行网络 I/O,您将​​默认使用 Android 4.0+。getByName()如果您提供域名(而不是点分 IP 表示法),则会进行 DNS 查找,这将触发NetworkOnMainThreadException.

于 2013-07-27T10:59:04.277 回答
1

您必须将代码放入 AsyncTask 中,如下所示:

new AsyncTask<Void,Void,Void>(){
doInBackground(){
  endPoint = InetAddress.getByName(target.getToIp());
    port = target.getPort();
    socket = new DatagramSocket();
}
}.execute();

请注意,此代码无效,请在此处阅读有关 AsyncTasks 的更多信息

于 2013-07-27T11:15:38.033 回答
0

Android 4.0 不允许在主线程上使用网络。如果您在 Android 2.3 或其他版本上运行代码,它不会抛出任何异常。

于 2013-07-27T10:58:22.057 回答