2013-10-08 3 views
-2

간단히 말해서, 나는 PC를 만들고있다. < --- 간단한 소켓과 인쇄 작가를 사용하는 Android 채팅. 나는 PC 클라이언트와 서버를 가지고 있고, 실제로 작동하지 않을 수있는 것은 안드로이드 다. 정말 안드로이드 다. 누구든지 연결을 시도 할 때이 오류가 발생하는 유청을 도와 줄 수 있습니까?android.os.NetworkOnMainThreadException 타블렛에서 채팅 프로그램

FYI : 나는 구글과 asynctask에서 stackoverflow의 나머지 부분을 조사했지만 아무 것도 명확하지 않다. 나는 그것이 어떻게 작동하는지 이해하려고 노력하고 있지만 아무런 예도 없다. 내 connectButton onClickListener가 새로운 ServerTask (AsyncTask)를 시작하고 onClickListener에서 사용했던 코드에 코드를 넣도록 코드를 변경했습니다. 분명히 가능하지 않은 doInBackground의 UI에 쓰기 때문에 예외를 주석 처리해야했습니다. 내가 연결할 수없는 이유는 새로운 AsyncTask를 당신은 주 스레드에서 네트워킹을 할 수없는

package com.example.JurkoAndroidChat; 

import android.app.Activity; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.view.View; 

import java.net.*; 
import java.io.*; 
import java.util.*; 



public class MyActivity extends Activity { 
    /** 
    * Called when the activity is first created. 
    */ 
    // Right here, we connecting the components of the main.xml form to code 
    Button connectButton, disconnectButton, sendButton; 
    TextView chatArea, clientArea; 
    EditText messageField, usernameField, ipField; 

    //Extra variables and sockets 
    String username, serverIP; 
    int Port = 5000; 
    Socket sock; 
    PrintWriter out; 
    BufferedReader in; 
    ArrayList<String> userList; 
    Boolean isConnected = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("Working?"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     userList = new ArrayList(); 
     connectButton = (Button)findViewById(R.id.button); 
     sendButton = (Button)findViewById(R.id.button1); 
     disconnectButton = (Button)findViewById(R.id.button2); 

     chatArea = (TextView)findViewById(R.id.textView2); 
     clientArea = (TextView)findViewById(R.id.textView3); 

     messageField = (EditText)findViewById(R.id.editText2); 
     usernameField = (EditText)findViewById(R.id.editText); 
     ipField = (EditText)findViewById(R.id.editText1); 

     connectButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       if (isConnected == false) { 
        username = usernameField.getText().toString(); 
        usernameField.setFocusable(false); 
        usernameField.setClickable(false); 
        serverIP = ipField.getText().toString(); 
        ipField.setFocusable(false); 
        ipField.setClickable(false); 
        executeTask(); 

       } else if (isConnected == true) { 
        chatArea.append("You are already connected to the server.\n"); 
       } 
      } 
     }); 

     disconnectButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       String bye = (username + ": :Disconnect"); 
       try { 
        out.print(bye); 
        out.flush(); 
        chatArea.append("Disconnected.\n"); 
        sock.close(); 

       } catch (Exception e) {e.printStackTrace();} 
       isConnected = false; 
       usernameField.setFocusable(true); 
       usernameField.setClickable(true); 
       ipField.setFocusable(true); 
       ipField.setClickable(true); 
       clientArea.setText(""); 
      } 
     }); 

     sendButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       String nothing = ""; 
       if ((messageField.getText().toString().equals(nothing))) { 
        messageField.setText(""); 
        messageField.requestFocus(); 
       } else { 
        try { 
         out.println(username + ":" + messageField.getText().toString() + ":" + "Chat"); 
         out.flush(); 
        } catch (Exception e) { 
         chatArea.append("Message was not sent.\n"); 
        } 
        messageField.setText(""); 
        messageField.requestFocus(); 
       } 
      } 
     }); 


    } 

    public class ServerTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... voids) { 
      try { 
       Log.i("Asynctask", "doInBackground"); 
       sock = new Socket(serverIP, Port); 
       out = new PrintWriter(sock.getOutputStream()); 
       in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
       out.println(username + ":" + "has connected." + ":" + "Connect"); 
       out.flush(); 
       isConnected = true; 

      } catch (Exception ex) { 
//     chatArea.append("Unable to connect to " + serverIP + " at port " + Port + "." + ex); 
//     ex.printStackTrace(); 
//     usernameField.setFocusable(true); 
//     usernameField.setClickable(true); 
//     ipField.setFocusable(true); 
//     ipField.setClickable(true); 

      } 


       ListenThread(); 
      return null; //To change body of implemented methods use File | Settings | File Templates. 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      //To change body of overridden methods use File | Settings | File Templates. 
     } 

    } 

    public void executeTask() { 
     new ServerTask().execute(); 
    } 

    public class IncomingReader implements Runnable { 
     @Override 
     public void run() { 
      //To change body of implemented methods use File | Settings | File Templates. 
      String[] data; 
      String stream, done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat"; 

      try { 
       while ((stream = in.readLine()) != null) { 
        data = stream.split(":"); 

        if (data[2].equals(chat)) { 
         chatArea.append(data[0] + ": " + data[1] + '\n'); 
        } else if (data[2].equals(connect)) { 
         chatArea.setText(""); 
         userAdd(data[0]); 
        } else if (data[2].equals(disconnect)) { 
         userRemove(data[0]); 
        } else if (data[2].equals(done)) { 
         clientArea.setText(""); 
         writeUsers(); 
         userList.clear(); 
        } 


       } 
      } catch (Exception e) {e.printStackTrace();} 
     } 
    } 

    public void ListenThread() { 
     Thread IncomingReader = new Thread(new IncomingReader()); 
     IncomingReader.start(); 
    } 



    public void userAdd(String data) { 
     userList.add(data); 
    } 

    public void userRemove(String data) { 
     chatArea.append(data + " has disconnected from the server.\n"); 
     for (String token:userList) 
      if (token.equals(data)) 
       userList.remove(token); 
    } 

    public void writeUsers() { 
     String[] tempList = new String[(userList.size())]; 
     userList.toArray(tempList); 
     for (String token:tempList) { 
      clientArea.append(token + '\n'); 
     } 
    } 








} 
+4

그건 천개의 다른 질문과 중복됩니다. 그냥'NetworkOnMainThreadException'에 대한 구글. – Ahmad

+0

거의해야 할 필요는 없지만. 예외 * 이름 *은 자명하지만, 도움이되지 않으면 Javadoc을 읽으십시오. – EJP

답변

0

을 시작하면 난 그냥 이해가 안 돼요, 당신은 새로운 하나 또는 네트워킹 작업을 수행하는 순서대로 AsyncTask을 만들어야합니다.

http://developer.android.com/reference/android/os/AsyncTask.html

+0

AsyncTask에서 네트워킹을 할 수 없다는 말입니까? – codeMagic

+1

너무 빨리 입력 한 것을 보지 못했습니다. 그것은 편집됩니다! – HappyDump

+0

AsyncTask와 함께 사용하도록 편집되었습니다. 나는 그것이 어떻게 작동 하는지를 이해하지만, 나는 왜 내가 접속할 수 없으며 이것이 메시지를 보내는 데 어떻게 영향을 미치는지에 대해 의아해한다. 여기 내가 이해하는 바가 있습니다. Click to connect : 다른 스레드와 같은 새로운 AsyncTask를 시작하여 NetworkOnMainThread 문제를 해결해야합니다. 그런 다음 ListenThread()는 다른 스레드를 실행하여 메시지를 구문 분석합니다. 이 모든 것이 여전히 실행되어야합니다. 그렇지 않으면 가비지 콜렉션이 어떻게 든 집니까? 고맙습니다. –