Problem bei Textausgabe aus einem Runnable Thread

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem bei Textausgabe aus einem Runnable Thread

    Hallo,
    habe mich nun doch daran gemacht, eine App für die Anzeige von (Vektor)-Karten zu machen.
    Dazu nutze ich die die Libary mapsforge-map-0.3.0-jar-with-dependencies.jar von mapsforge (code.google.com/p/mapsforge/ ) Danke nochmal an CD-Wechsler für den Tipp vor 9 Monaten.....
    Funktioniert auch alles ganz gut!
    Wenn ich allerdings eine größere Track-Datei (GPX) einlade um die Daten als Spur in einem Overlay anzuzeigen dauert das halt lange....
    Deshalb habe ich dieses Einlesen in einen Extra Thread getan.

    Quellcode

    1. Runnable runnable = new Runnable()
    2. {
    3. String test="";
    4. @Override
    5. public void run()
    6. {
    7. test=track_datei_einlesen(letze_track_Datei);
    8. if (test.length() > 0)
    9. {
    10. Toast.makeText(this, test, Toast.LENGTH_LONG).show();
    11. }
    12. else
    13. {
    14. setze_track_Overlay(); // Hier wird das Oberlay über der angezeigten Karte angezeigt
    15. }
    16. }
    17. };
    18. new Thread(runnable).start();
    Alles anzeigen

    Funktioniert alles soweit, aber wenn ich dafür sorge dass in test etwas steht stürzt die App ab (Tut uns leid..., Beenden).

    Wie kann ich den String test ausgeben, dennnwen da was drun steht, ist in der Trackdatei ein Fehler festgestellt worden beim Einlesen.
    Diesem möchte ich dem User nicht vorenthalten.

    Welchen Denkfehler mache ich?

    Mit fragenden Grüßen,
    schymura :P
  • Aus einem Thread kannst du niemals Dinge im UI-Thread ansprechen, weil du nicht weisst ob die noch da sind (Stichwort Nullpointer Exception).
    Dafür benötigst du einen Handler, welcher UI Ausgaben macht bzw. darüber kommuniziert.

    Das ist mir immer alles viel zu kompliziert, deswegen nutze ich den AsyncTask, der hat schon entsprechende Methoden dafür (zb Progress).

    developer.android.com/reference/android/os/AsyncTask.html
  • Hallo killphil75,
    danke, ja, das war es natürlich.
    Hatte ich nicht dran gedacht, weil ja die anderen Funtionen und Methoden sauber laufenm so lange sie keine Ausgabe auf dm Schirm machen wollen......
    Falls es dich (oder jemand anders) interesssiert hier dann der Quellcode, der sauber läuft, auch ohne AsyncTask:

    Quellcode

    1. final Handler handl= new Handler();
    2. Thread thread= new Thread(new Runnable()
    3. {
    4. @Override
    5. public void run()
    6. {
    7. final String test=track_datei_einlesen(letze_track_Datei);
    8. if (test.length() > 0)
    9. {
    10. handl.post(new Runnable()
    11. {
    12. @Override
    13. public void run()
    14. {
    15. Toast.makeText(this, test, Toast.LENGTH_LONG).show();
    16. }
    17. });
    18. }
    19. else
    20. { // Hier dann das Overlay hin
    21. setze_track_Overlay();
    22. }
    23. }
    24. });
    25. thread.start();
    Alles anzeigen


    Dankbare Grüße,
    schymura ^^