2013-10-08 2 views
-2

Короче говоря, я делаю ПК < ---> Android-чат с использованием простых сокетов и писателей. У меня есть клиент ПК и сервер, все, с чем я не могу работать, это Android, потому что я действительно новичок в этом. Может ли кто-нибудь помочь мне в сыворотке, я получаю эту ошибку, когда пытаюсь подключиться?android.os.NetworkOnMainThreadException чат-программа на планшете

FYI: Я искал google и остальную часть stackoverflow в asynctask, но ничего не ясно. Я пытаюсь понять, как это работает, но ни один пример не приближается. Я изменил код, поэтому мой connectButton onClickListener запускает новую ServerTask (это AsyncTask), и я помещаю ее в код, который я использовал для onClickListener. Я должен был прокомментировать исключение, потому что он писал в пользовательский интерфейс doInBackground, который, по-видимому, невозможен. Я просто не понимаю, почему я не могу подключиться, если я начал новый 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

Это дубликат ... тысяч других вопросов. Просто google для 'NetworkOnMainThreadException'. – Ahmad

+0

Хотя вам вряд ли понадобится. Исключение * имя * не требует пояснений, и если это вам не поможет, прочитайте его Javadoc. – EJP

ответ

0

Вы не можете сделать сети на главном потоке, вы должны создать новый или AsyncTask для того, чтобы сделать любую операцию Networking.

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

+0

Вы говорите, что не можете создавать сети в «AsyncTask»? – codeMagic

+1

Спасибо, я не видел, что я набрал слишком быстро. он отредактирован! – HappyDump

+0

Отредактировано для использования с AsyncTask. Я понимаю, как это работает, но я все еще очень озадачен, почему я не могу подключиться/как это влияет на отправку сообщений. Вот что я понимаю. Нажмите connect: запускает новую AsyncTask, которая похожа на другой поток, поэтому она должна решить проблему NetworkOnMainThread: Then ListenThread() выполняет другой поток для разбора сообщения. Это все еще должно работать да или сборка мусора каким-то образом забирает ее? Большое спасибо. –

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