2016-01-24 7 views
-4

Я получаю NetworkOnMainThreadException при использовании RunnableПолучение NetworkOnMainThreadException при реализации Runnable

Код:

public class FullscreenActivity extends AppCompatActivity { 
    public Socket socket; 
    public int SERVERPORT = 5000;   /* port 5000 (for testing) */ 
    public String SERVER_IP = "10.0.2.2"; /* local Android address of localhost */ 
    ViewFlipper flipper; 
    ListView listing; 

    public void attemptConnect(View view) { 
     try { 
      EditText editTextAddress = (EditText) findViewById(R.id.address); 
      EditText editTextPort = (EditText) findViewById(R.id.port); 
      String SERVER_IP_loc = editTextAddress.getText().toString(); 
      int SERVERPORT_loc = Integer.parseInt(editTextPort.getText().toString()); 
      System.out.println("Attempt Connect: IP " + SERVER_IP_loc + " Port: " + SERVERPORT_loc); 
      System.out.println("SET"); 
      ClientThread myClientTask = new ClientThread(SERVER_IP_loc, SERVERPORT_loc); 
      myClientTask.run(); 
      System.out.println("CONNECTED"); 
      flipper.setDisplayedChild(1); 
     } catch (Exception e) { 
      System.err.println(e.getMessage()); 
     } 
    } 

    // Thinks the following is not a thread ?? 
    class ClientThread implements Runnable { 
     ClientThread(String addr, int port) { 
      SERVER_IP = addr; 
      SERVERPORT = port; 
     } 

     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       // gets to this line fine 
       socket = new Socket(serverAddr, SERVERPORT); 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

Мои разрешения установлены для предоставления доступа в Интернет:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

Я получаю следующая ошибка:

6188-6188/test W/System.err: android.os.NetworkOnMainThreadException 
6188-6188/test W/System.err:  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) 
6188-6188/test W/System.err:  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110) 
6188-6188/test W/System.err:  at libcore.io.IoBridge.connectErrno(IoBridge.java:137) 
6188-6188/test W/System.err:  at libcore.io.IoBridge.connect(IoBridge.java:122) 
6188-6188/test W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
6188-6188/test W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163) 
6188-6188/test W/System.err:  at java.net.Socket.startupSocket(Socket.java:592) 
6188-6188/test W/System.err:  at java.net.Socket.<init>(Socket.java:226) 
6188-6188/test W/System.err:  at test.FullscreenActivity$ClientThread.run(FullscreenActivity.java:363) 
6188-6188/test W/System.err:  at test(FullscreenActivity.java:340) 
6188-6188/test W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
6188-6188/test W/System.err:  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(test:270) 
6188-6188/test W/System.err:  at android.view.View.performClick(View.java:5198) 
6188-6188/test W/System.err:  at android.view.View$PerformClick.run(View.java:21147) 
6188-6188/test W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
6188-6188/test W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
6188-6188/test W/System.err:  at android.os.Looper.loop(Looper.java:148) 
6188-6188/test W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
6188-6188/test W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
6188-6188/test W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
6188-6188/test W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Насколько я могу судить, это должно функционировать должным образом. Кажется, что Runnable - это не поток, но я не могу понять, почему.

ответ

2

Вам нужен Thread для запуска вашего Runnable для вас. Просто позвонить run на Runnable не запускает его в другой теме.

new Thread(new ClientThread(SERVER_IP_loc, SERVERPORT_loc)).start(); 
+0

Это не решит проблему. Он по-прежнему создает исключение при попытке создать новый сокет. – interplex

+0

Вы уверены, что это при создании сокета? Вы также пытаетесь читать из «Socket» из потока пользовательского интерфейса? –

+0

Да. Это: 'InetAddress serverAddr = InetAddress.getByName (SERVER_IP); System.out.println ("RUN2"); socket = new Socket (serverAddr, SERVERPORT); System.out.println («RUN3»); 'делает его RUN2, но не RUN3. – interplex

Смежные вопросы