String.length bircht ap

  • 5 Antworten
  • Letztes Antwortdatum
S

Satzende

Neues Mitglied
0
Hallo

Habe einen Socket server exempel kopiert und wollte nun die lenge der emfangenden nachricht ausgeben.

Aber an der stelle bircht die App ab.


Code:
public void run() {
            
        text.setText(msg.length());
        text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");

Kann mir jemand sagen wie ich doch noch ans ziel komme ?
 
Bitte nicht zu viel von deinem innovativen und einzigartigen Code hier reinstellen? ;)

Ich tippe mal darauf, dass der String msg nicht initalisiert wird und deine "Socket Server example" msg nicht befüllt ...
 
Bitte nicht zu viel von deinem innovativen und einzigartigen Code hier reinstellen?

Ich weiss schon was du meinst aber den code hab ich verlinkt. Ich stell ihn aber nochmal hier rein. Aber vorher muss jeder einen knebelvertrag unterschreiben.

Code:
package com.example.t2;






//package com.javacodegeeks.android.androidsocketserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {

    private ServerSocket serverSocket;

    Handler updateConversationHandler;

    Thread serverThread = null;

    private TextView text;

    public static final int SERVERPORT = 1511;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.text2);

        updateConversationHandler = new Handler();

        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//jede neue anfrage in einenen neuen thread
class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {

            try {

                socket = serverSocket.accept();

                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

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


//handel den input -> textview
class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {

            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

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

    //eine zeile vom imput einlesen, wenn der thread nicht unterbraichen ist
    public void run() {

        while (!Thread.currentThread().isInterrupted()) {

            try {

                String read = input.readLine();

                updateConversationHandler.post(new updateUIThread(read));

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

}


//texst in den viewtun 
class updateUIThread implements Runnable {
    private String msg ;
    String last = "";
    String temp;

    public updateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public void run() {
            
        text.setText(msg.length());
        text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");    
            
        }
    }
}

Dann hab ich Initialisiert
Code:
private String msg = "a" ;

hat aber keinen effekt

Der ursprüngliche Beitrag von 16:02 Uhr wurde um 16:12 Uhr ergänzt:

Logcat
01-03 16:08:01.886: E/AndroidRuntime(8642): FATAL EXCEPTION: main
01-03 16:08:01.886: E/AndroidRuntime(8642): android.content.res.Resources$NotFoundException: String resource ID #0x0
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.content.res.Resources.getText(Resources.java:1057)
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.widget.TextView.setText(TextView.java:4186)
01-03 16:08:01.886: E/AndroidRuntime(8642): at com.example.t2.MainActivity$updateUIThread.run(MainActivity.java:138)
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.os.Handler.handleCallback(Handler.java:725)
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.os.Handler.dispatchMessage(Handler.java:92)
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.os.Looper.loop(Looper.java:176)
01-03 16:08:01.886: E/AndroidRuntime(8642): at android.app.ActivityThread.main(ActivityThread.java:5279)
01-03 16:08:01.886: E/AndroidRuntime(8642): at java.lang.reflect.Method.invokeNative(Native Method)
01-03 16:08:01.886: E/AndroidRuntime(8642): at java.lang.reflect.Method.invoke(Method.java:511)
01-03 16:08:01.886: E/AndroidRuntime(8642): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
01-03 16:08:01.886: E/AndroidRuntime(8642): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
01-03 16:08:01.886: E/AndroidRuntime(8642): at dalvik.system.NativeStart.main(Native Method)
 
Du machst:

Code:
text.setText(msg.length());

was die Methode setText(int resId) aufruft! Das sucht nach einer Resource mit der Id, die der Länge von msg entspricht.

Die Methode 'setText(int resId)' ruft man mit 'R.string.XXXXX' wobei der Name 'XXXXX' eine String-Resource aus der Strings.xml ist. (Dazu wird dann in der (von der Entwicklungsumgebung) generierten Klasse 'R' in der inneren Klasse 'string' ein statisches int-Feld 'XXXXX' erzeugt, die die Resource-ID der String-Resource XXXXX enthält.)

Wenn Du die Zahl msg.length in text setzen willst (also einen String dessen Inhalt der Zahlenwert von msg.length() ist), musst Du

Code:
setText(String.valueOf(msg.length));

verwenden.

MfG Uwe
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Ausführliche erklärung .
Hab diese zeile eingefügt
Code:
text.setText(String.valueOf(msg.length()));
und die alte
Code:
text.setText(last.length().toString());
auskommentiert .


Hat nur nicht Funktioniert

catlog:

Code:
01-04 10:57:48.625: E/AndroidRuntime(5480): FATAL EXCEPTION: main
01-04 10:57:48.625: E/AndroidRuntime(5480): java.lang.NullPointerException
01-04 10:57:48.625: E/AndroidRuntime(5480):     at com.example.t2.MainActivity$updateUIThread.run(MainActivity.java:139)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at android.os.Handler.handleCallback(Handler.java:725)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at android.os.Looper.loop(Looper.java:176)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at android.app.ActivityThread.main(ActivityThread.java:5279)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at java.lang.reflect.Method.invokeNative(Native Method)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at java.lang.reflect.Method.invoke(Method.java:511)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
01-04 10:57:48.625: E/AndroidRuntime(5480):     at dalvik.system.NativeStart.main(Native Method)
 
jetzt bekommst Du eine NullpointerException, als ist eine der variablen text oder msg wieder nicht instantiiert.

Du solltest Dich vielleicht erst mit den Basics der Java-Entwicklung beschäftigen, wenn Du nicht mal verstehst, was falsch läuft, wenn Du eine NullpointerException bekommst und wie man das debuggt...

MfG Uwe
 
Zurück
Oben Unten