Witam, napisałem sobie najpierw czat socketowy w javie, później postanowiłem przepisać go na androida, wszystko działa poza tym, że gdy otrzymam wiadomość od innego użytkownika czatu to aplikacja się zawiesza i prosi o zamknięcie.
Oto część kodu:

Socket socket=null;  
SocketAddress sockaddr = new InetSocketAddress(host, port);
try  
{  
     socket = new Socket(); 
     socket.connect(sockaddr,5000);
}  
catch(Exception e)  
{  
     panel.append("***Nie mogę się połączyć z "+host+":"+port+"\n");
}

...

InputStream inStream = socket.getInputStream();
OutputStream outStream = socket.getOutputStream();
			        
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true); 

...

try  
{                
     while(true)  
     {   
	    if(in.hasNextLine())
            {
                  String input = in.nextLine();           // Tutaj występuje crash
			            		
		  if(input!=null && input.length()>0)
		        panel.append(" "+input+"\n");
            }
     }
}  

Linijka, w której crashuje:

String input = in.nextLine(); 

Proszę o podpowiedź jak to naprawić.

#edit
Proszę, oto Log:

04-15 04:32:49.058: W/dalvikvm(225): threadid=15: thread exiting with uncaught exception (group=0x4001b188)
04-15 04:32:49.069: E/AndroidRuntime(225): Uncaught handler: thread Thread-8 exiting due to uncaught exception
04-15 04:32:49.249: D/dalvikvm(225): GC freed 3113 objects / 373168 bytes in 158ms
04-15 04:32:49.249: E/AndroidRuntime(225): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.view.ViewRoot.invalidateChild(ViewRoot.java:570)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.view.ViewGroup.invalidateChild(ViewGroup.java:2396)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.view.View.invalidate(View.java:4945)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.widget.TextView.updateAfterEdit(TextView.java:4736)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.widget.TextView.handleTextChanged(TextView.java:6158)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6316)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:259)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:28)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.widget.TextView.append(TextView.java:2236)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at android.widget.TextView.append(TextView.java:2223)
04-15 04:32:49.249: E/AndroidRuntime(225): 	at pl.net.zapalka.client.Client$1.run(Client.java:104)
04-15 04:32:49.279: I/dalvikvm(225): threadid=7: reacting to signal 3
04-15 04:32:49.369: I/dalvikvm(225): Wrote stack trace to '/data/anr/traces.txt'

04-15 0449.249: E/AndroidRuntime(225): at pl.net.zapalka.client.Client$1.run(Client.java:104)
Linijka 104 to: panel.append(" "+input+"\n");