2017-11-10 20 views
0

이제 가정용 LAN에있는 내 데스크톱 PC의 서버 소켓에 연결하기 위해 몇 시간 (Android 7.1.2에서 실행되는) 내 앱을 다운로드하려고했습니다. 내가 프로그래밍 (뿐만 아니라 안드로이드)를 소켓에 새로 온 사람 때문에원격 tcp 소켓에 연결할 때 내 앱이 작동을 멈 춥니 다.

... 
Waiting for process to come online 
Connected to process 16980 on device samsung-gt_i9515-a72266ed 
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page. 
W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.jonas.network_connector, PID: 16980 
        android.os.NetworkOnMainThreadException 
         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303) 
         at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:333) 
         at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196) 
         at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) 
         at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) 
         at java.net.Socket.connect(Socket.java:605) 
         at java.net.Socket.connect(Socket.java:554) 
         at java.net.Socket.<init>(Socket.java:431) 
         at java.net.Socket.<init>(Socket.java:210) 
         at com.example.jonas.network_connector.MainActivity$2.onClick(MainActivity.java:88) 
         at android.view.View.performClick(View.java:5637) 
         at android.view.View$PerformClick.run(View.java:22433) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6186) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 
I/Process: Sending signal. PID: 16980 SIG: 9 
Application terminated. 

내가로 진행하는 방법을 알고하지 않습니다 실행되면

public class MainActivity extends AppCompatActivity { 

    static final String SERVER_IP = "192.168.XXX.XXX"; // X's are replaced by actual IP 
    static final int PORT  = 30000; 

    Socket clientSocket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Button btReceive = (Button) findViewById(R.id.btReceive); 

     final TextView txtReceivedText = (TextView) findViewById(R.id.txtReceivedText); 
     final TextView txtStatus  = (TextView) findViewById(R.id.txtStatus); 



     btReceive.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 

       txtStatus.setText("Received button pressed."); 

       try { 

        Socket s = new Socket(SERVER_IP, PORT); 


        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        final String st = input.readLine(); 

        txtReceivedText.setText(st); 

        s.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

     }); 

    } 


} 

나는 안드로이드 스튜디오에서 콘솔의 출력을 얻을 오류를 찾으십시오.

내 매니페스트 권한 라인이 있습니다

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

답변

1

:

class TCPTask extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
     } 
    } 

는 비동기 작업을 실행하십시오.

btReceive.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       txtStatus.setText("Received button pressed."); 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          Socket s = new Socket(SERVER_IP, PORT); 
          BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
          final String st = input.readLine(); 
          txtReceivedText.post(new Runnable(){ 

           @Override 
           public void run() { 
            txtReceivedText.setText(st); 
           } 
          }); 

          s.close(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
        } 
       }).start(); 
      }); 
1

android.os.NetworkOnMainThreadException

이 예외는 메인 스레드에서 원격 호출하려고 있음을 알려줍니다에게. AsyncTask를 사용하여 전화를 걸면 문제가 다시 나타나서는 안됩니다. 안드로이드 OS는 UI를 잠글 수 있기 때문에 메인 쓰레드에서 장시간 실행되는 작업을 방지합니다.

0

android.os.NetworkOnMainThreadException

그것의 주 스레드에서 네트워킹 작업을 수행 할 수있는 응용 프로그램 시도를 의미한다. AsyncTask에서 코드를 실행하십시오.

예 :

이 한 OnCreate에서이 코드를 추가() 메소드 당신은 작업자 스레드에서 네트워크 작업을 할 필요가

new TCPTask().execute();