Problem mit Sockets

  • Antworten:3
arbengie
  • Forum-Beiträge: 8

16.01.2013, 18:43:15 via Website

Hallo :-)
Ich schreibe zur Zeit einnen kl. Chat. Ich habe ihn zuvor in "reinem" Java geschrieben und da funktioniert auch alles super. Jetzt möchte ich ihn auf Android erweitern aber bei meiner send() Methode kackt das Programm ab und ich bekomme nen schwarzen Bildschirm und die Nachricht "Programm angehalten".
Der Server ist sebstverständlich auch offen und IP und Port stimmen überein.
Könnte mir jmd. weiterhelfen?

1public class MainActivity extends Activity {
2
3 private Socket client;
4 private Connection con;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_main);
10 new MainActivity();
11 }
12
13 public MainActivity() {
14 con = new Connection();
15 con.start();
16 }
17
18 @Override
19 public boolean onCreateOptionsMenu(Menu menu) {
20 getMenuInflater().inflate(R.menu.activity_main, menu);
21 return true;
22 }
23
24 public void sendMsg(View view) {
25 EditText input = (EditText) findViewById(R.id.input);
26 con.send(input.getText().toString()); // <--- Hier stürzt das Programm ab
27 }
28
29 public class Connection extends Thread {
30
31 public Connection() {
32
33 }
34
35 public void run() {
36 try {
37 client = new Socket("localhost", 9999);
38 EditText chat = (EditText) findViewById(R.id.chat);
39 chat.append("Verbindung zum Server erfolgreich.\n");
40 while (true) {
41 String s = receive();
42 chat.append("Server: " + s + "\n");
43 }
44
45 }
46 catch (IOException e) {
47 Log.d("Fehler", "Fehler in der Run Methode.");
48 }
49 }
50
51 public void send(String s) {
52 try {
53 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
54 out.write(s);
55 out.newLine();
56 out.flush();
57 }
58 catch (IOException e) {
59 Log.d("Fehler", "Fehler beim Senden.");
60 }
61 }
62
63 public String receive() {
64 String s = null;
65 try {
66 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
67 s = in.readLine();
68 }
69 catch (IOException e) {
70 Log.d("Fehler", "Fehler beim Empfangen.");
71 }
72 return s;
73 }
74
75 }
76
77}

Logcat:

101-16 18:41:42.798: D/Fehler(31555): Fehler in der Run Methode.
201-16 18:41:42.863: D/Fehler(31555): Fehler in der Run Methode.
301-16 18:41:42.938: D/CLIPBOARD(31555): Hide Clipboard dialog at Starting input: finished by someone else... !
401-16 18:41:47.593: D/AndroidRuntime(31555): Shutting down VM
501-16 18:41:47.593: W/dalvikvm(31555): threadid=1: thread exiting with uncaught exception (group=0x40c681f8)
601-16 18:41:47.598: E/AndroidRuntime(31555): FATAL EXCEPTION: main
701-16 18:41:47.598: E/AndroidRuntime(31555): java.lang.IllegalStateException: Could not execute method of the activity
801-16 18:41:47.598: E/AndroidRuntime(31555): at android.view.View$1.onClick(View.java:3100)
901-16 18:41:47.598: E/AndroidRuntime(31555): at android.view.View.performClick(View.java:3627)
1001-16 18:41:47.598: E/AndroidRuntime(31555): at android.view.View$PerformClick.run(View.java:14329)
1101-16 18:41:47.598: E/AndroidRuntime(31555): at android.os.Handler.handleCallback(Handler.java:605)
1201-16 18:41:47.598: E/AndroidRuntime(31555): at android.os.Handler.dispatchMessage(Handler.java:92)
1301-16 18:41:47.598: E/AndroidRuntime(31555): at android.os.Looper.loop(Looper.java:137)
1401-16 18:41:47.598: E/AndroidRuntime(31555): at android.app.ActivityThread.main(ActivityThread.java:4511)
1501-16 18:41:47.598: E/AndroidRuntime(31555): at java.lang.reflect.Method.invokeNative(Native Method)
1601-16 18:41:47.598: E/AndroidRuntime(31555): at java.lang.reflect.Method.invoke(Method.java:511)
1701-16 18:41:47.598: E/AndroidRuntime(31555): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
1801-16 18:41:47.598: E/AndroidRuntime(31555): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
1901-16 18:41:47.598: E/AndroidRuntime(31555): at dalvik.system.NativeStart.main(Native Method)
2001-16 18:41:47.598: E/AndroidRuntime(31555): Caused by: java.lang.reflect.InvocationTargetException
2101-16 18:41:47.598: E/AndroidRuntime(31555): at java.lang.reflect.Method.invokeNative(Native Method)
2201-16 18:41:47.598: E/AndroidRuntime(31555): at java.lang.reflect.Method.invoke(Method.java:511)
2301-16 18:41:47.598: E/AndroidRuntime(31555): at android.view.View$1.onClick(View.java:3095)
2401-16 18:41:47.598: E/AndroidRuntime(31555): ... 11 more
2501-16 18:41:47.598: E/AndroidRuntime(31555): Caused by: java.lang.NullPointerException
2601-16 18:41:47.598: E/AndroidRuntime(31555): at com.example.chatapp.MainActivity$Connection.send(MainActivity.java:68)
2701-16 18:41:47.598: E/AndroidRuntime(31555): at com.example.chatapp.MainActivity.sendMsg(MainActivity.java:41)
2801-16 18:41:47.598: E/AndroidRuntime(31555): ... 14 more

— geändert am 16.01.2013, 18:44:16

Antworten
Jan M.
  • Forum-Beiträge: 36

16.01.2013, 19:39:48 via Website

spontan würd ich mal sagen, dass die variable input null ist.

was sagt der debugger zu der zeile EditText input = (EditText) findViewById(R.id.input);

Antworten
Andreas Hoffmann
  • Forum-Beiträge: 36

17.01.2013, 16:34:10 via App

also wenn ich das rochtig sehe hast du folgende fehler drin...

zugriff auf edittext aus einem fremden thread...
ich denke du solltest wie bei java swing auf uikomponenten nur mit dem uithread zugreifen

außerdem greifst du aus zwei verschiedenen threads auf socket zu. ich weiß nicht ob socket threadsave ist.

ich wüde die ganze socket geschichte in einen thread packen und dort die kommunikation regeln...

Antworten
Christian
  • Forum-Beiträge: 307

17.01.2013, 17:02:01 via Website

Hi,

wie es Andreas schon gesagt hat darfst du UI-Element nur im MainThread verändern.
Wenn du nun aber aus deinen Thread diese Element verändern möchtest benötigst du einen Handler.
Herr Vogella hat dazu eine kleines Tut geschrieben kannst du ja mal ansehen -> Link

Achso die ganzen "findViewById" Methoden solltest du in die "oncreate" verlegen und ihren Return-Wert in globale Variablen speichern.

mfg Christian

Antworten