2012-01-24 62 views
2

這個想法是開始聊天。所以,我有我的類此屬性:Android應用程序中奇怪的NetworkOnMainThreadException?

private MulticastSocket so; 
private EditText messageBoard; 
private InetAddress serverAddress; 
private int port; 

然後,我有這樣的代碼在onCreate()方法:

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second); 

    // connect to server 
    connect(); 

    // Associate a variable with the Button on the interface 
    final Button sendButton = (Button) findViewById(R.id.button2); 
    sendButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // when the button is clicked the next screen is loaded 
      sendMessage(); 
     } 
    }); 

} // end of onCreate 

這裏是我的connect()方法:

private void connect() { 

    port = 4456; 

    // convert the host name to InetAddress 
    try { 
     serverAddress = InetAddress.getByName("my server address is here"); 
    } catch (Exception e) {} 

    // create socket and start communicating 
    try { 
     so = new MulticastSocket(port); 
     so.joinGroup(serverAddress); 
    } catch (IOException e) {} 

    // start listening for incoming messages 
    new Receiver(so, messageBoard); 
} 

看起來一切權利我但這就是它說的:

01-24 23:33:16.277: W/dalvikvm(569): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
01-24 23:33:16.357: E/AndroidRuntime(569): FATAL EXCEPTION: main 
01-24 23:33:16.357: E/AndroidRuntime(569): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.regeduser00x.proj1/com.regeduser00x.proj1.Second}: android.os.NetworkOnMainThreadException 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.os.Looper.loop(Looper.java:137) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread.main(ActivityThread.java:4424) 
01-24 23:33:16.357: E/AndroidRuntime(569): at java.lang.reflect.Method.invokeNative(Native Method) 
01-24 23:33:16.357: E/AndroidRuntime(569): at java.lang.reflect.Method.invoke(Method.java:511) 
01-24 23:33:16.357: E/AndroidRuntime(569): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-24 23:33:16.357: E/AndroidRuntime(569): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-24 23:33:16.357: E/AndroidRuntime(569): at dalvik.system.NativeStart.main(Native Method) 
01-24 23:33:16.357: E/AndroidRuntime(569): Caused by: android.os.NetworkOnMainThreadException 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
01-24 23:33:16.357: E/AndroidRuntime(569): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
01-24 23:33:16.357: E/AndroidRuntime(569): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
01-24 23:33:16.357: E/AndroidRuntime(569): at java.net.InetAddress.getByName(InetAddress.java:295) 
01-24 23:33:16.357: E/AndroidRuntime(569): at com.regeduser00x.proj1.Second.connect(Second.java:99) 
01-24 23:33:16.357: E/AndroidRuntime(569): at com.regeduser00x.proj1.Second.onCreate(Second.java:38) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.Activity.performCreate(Activity.java:4465) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
01-24 23:33:16.357: E/AndroidRuntime(569): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
01-24 23:33:16.357: E/AndroidRuntime(569): ... 11 more 

Second.java:99恰巧是serverAddress = InetAddress.getByName("my server address is here");和38行恰巧是connect();它是怎麼回事?我已經在一個小測試程序中用InetAddress測試了這條線,它完美地工作,但是在這裏發生了一些事情。

回答

9

這一行:

Caused by: android.os.NetworkOnMainThreadException 

告訴您是怎麼回事。

您正試圖訪問Main(UI)線程上的網絡功能。從Honeycomb開始,系統會在您執行此操作時引發異常。

要解決你只需要移動正在觸摸網絡它自己的線程的任何事情。

+0

現在我有一個單獨的類和線程,但我得到另一個錯誤 公共類Receiver實現Runnable私有線程myActivity = new Thread(this); \t private MulticastSocket so; \t公共接收機(MulticastSocket上襪子,的EditText messBo){ \t所以=襪子; \t myActivity.start(); \t} \t @Override \t公共無效的run(){ \t \t字節[]數據=新的字節[1024]; \t \t而(真){ \t \t \t嘗試{ \t \t \t \t DatagramPacket的包=新的DatagramPacket(數據,數據。長度); \t \t \t \t so.receive(packet); // ... 我在'so.receive(packet)處得到NullPointerException;'現在有什麼問題? – RegedUser00x

1

這樣做是爲了確保你不會從處理來自user.By任何輸入事件阻塞UI線程應用程序不能執行任何事件處理例程會阻塞UI線程。

正常情況下,大多數UI系統都有一個看門狗定時器,它會一直監視UI線程上的任何長操作,並且如果UI線程被阻塞超過閾值(可能在製造商/操作系統的Android設備中爲10-20秒版本)看門狗中斷,並導致「應用程序不響應」(aka ANR)彈出。

1

如果你只是想要一個簡單的工作,解決這個問題,指定升級Froyo或薑餅的最低SDK版本,省略targetSdkVersion:

android:minSdkVersion="8" 
相關問題