1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Schnittstelle zwischen Java-Programm und Android GUI fehlerhaft

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Groath, 14.07.2011.

  1. Groath, 14.07.2011 #1
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Moin liebes Team.

    Wir haben eine Android-GUI per Eclipse erstellt, welche ein Input bekommt und einen Output auf einem TextView liefert. Das klappt alles wunderbar.

    Wir haben dazu ein mehr oder minder kompliziertes Java-Programm, welches auf txt-Dateien auf der Festplatte zugreift, deren Methode ein String verlangt und einen Output liefert.

    Nun sollen diese beiden Programme verknüpft werden. Unser Objekt heißt Init. Unser Android-Programm heißt AULDA_4. Sobald ich in AULDA versuche, ein Init-Objekt zu erstellen, spuckt mir der Android-Emulator aus:

    The Application AULDA_4 (process pnlp.aulda_4) has stopped unexpectedly. Please try again.

    Init ist in einem anderen Package als AULDA_4. die Datei, auf die Init zugreift befindet sich in einem Verzeichnis unter C:/.

    Wieso stürzt die Android Application ab, wenn ein Init erstellt wird? Init erstellen läuft wunderbar, wenn das Programm mit einer Test.java gestartet wird und nicht aus Android.
    Nun haben wir Init geleert und das Programm vor dem Absturz bewahrt. Es kann also nicht daran liegen, dass etwas externes erstellt wird, sondern an dem, das Init tut.

    Muss man etwas dabei beachten (Manifest, import?), wenn man Java Applications ausführt oder wenn man auf Dateien zugreift, die auf der Festplatte gespeichert sind?

    Wenn eine Test.java in seiner main das gesamte Programm ausführen kann, wieso kann die Android App nicht darauf zugreifen und das Programm ausführen?

    Ich hoffe, ihr könnt uns helfen...
    Bei Rückfragen einfach posten und wir erklären euch weiteres.

    Liebe Grüße, Francesca, Arne und Görkem
     
  2. kleinerkathe, 14.07.2011 #2
    kleinerkathe

    kleinerkathe Android-Lexikon

    Beiträge:
    1,365
    Erhaltene Danke:
    219
    Registriert seit:
    23.01.2010
    Wenn ich das richtig verstanden habe, führst die "Aulda" ja auch auf dem Emulator/Phone aus? Wenn ja, wie soll das Programm dort "C:\" finden?
     
  3. the_alien, 14.07.2011 #3
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Ja, nicht auf hart codierte Pfade zugreifen. Das ist ein absolutes NoGo, unabhängig von der Programmiersprache oder Plattform.
    Ihr programmiert das Ding unter Windows, das ist schön aber wollt es jetzt in einem Linux ausführen. Das kann schlicht nicht funktionieren wenn ihr harte Pfade nutzt und so liest es sich wenn ihr von "C:/" sprecht.
     
  4. Groath, 14.07.2011 #4
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Jap... Das haben wir uns dann auch irgendwann gefragt.
    Neuer Versuch mit:

    f=new FileReader("sdcard"+File.separatorChar+"Data"+File.separatorChar+"Arpa - Sampa Table.txt");

    Die daten sind per Eclipse DDMS in der sdcard. Nun kommt nicht mehr diese Fehlermeldung, das Programm reagiert einfach nicht mehr. Schwarzer Bildschirm bis die Meldung: Activity AULDA_4 is not responding.

    Habens auch damit versucht:

    File sdcard = Environment.getExternalStorageDirectory();
    try{
    f=new FileReader(sdcard.getAbsolutePath()+File.separatorChar+
    "Data"+File.separatorChar+"Arpa - Sampa Table.txt");
    etc.

    Nun wissen wir leider wirklich nicht weiter. Ist die directory falsch gesetzt?
     
  5. Groath, 14.07.2011 #5
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Oh. Init an sich braucht auf meinem PC einige Sekunden, um initiiert zu werden. Kann es sein, dass das Handy bzw der Emulator einfach zu wenig Prozessorleistung besitzt, als dass es Init initiieren könnte, bevor Android wegen fehlendem respond meckert?
     
  6. Kranki, 14.07.2011 #6
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Es beschwert sich nicht, weil es zu lange dauert, sondern weil es abstürzt. "Application has stopped unexpectedly" heißt Exception, Näheres gibts mit logcat.
     
  7. the_alien, 14.07.2011 #7
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Du gibst dir die Antwort doch selbst:
    Wenn es an einem PC schon länger dauert, dann muss man doch zwingend davon ausgehen, dass es auf einem Handy noch deutlich länger dauert.

    Hier muss man nebenläufig Arbeiten, sprich mach nen Thread auf oder einen AsyncTask und greif darin auf die Datei zu.

    Darf man Fragen was genau ihr macht? Klingt für mich nach Studentenprojekt für die Uni?
     
  8. Groath, 14.07.2011 #8
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Genau so etwas ist das ^^
    Es ist eine App, die helfen soll, englische Wörter, die deutsch ausgesprochen wurden zu erkennen. Input von 'z I s' sucht anhand einer transition table und Werten für Ähnlichkeiten der Aussprachen nach Lautworten, die sich ähnlich anhören, beachtet dabei natürlich typisch deutsche aussprachefehler, streicht alles, was kein echtes Wort ist und gibt zum Schluss 5 Wörter mit den dazugehörigen values aus. So wird aus 'z I s' letzendlich this ^^
    Dazu liest er u.A. eine txt-datei ein, die 3mb groß ist, das SEMPA dictionary enthält und mehrere tausend Einträge hat.. Wird wohl tatsächlich daran hapern. Na darüber wird sich unser Dozent aber sehr freuen... ^^
    Kann ich die bereits angefertigten xml-Dateien für irgendwas benutzen?
    Würde gerne eine Art App präsentieren - wird dann wohl ein Java Applet werden -, ohne die gesamte gui nochmal von vorne programmieren zu müssen :/ Eine Idee?

    @ Kranki:
    Er wirft kein "Application has stopped unexpectedly" mehr, wie in den Posts beschrieben. Danke trotzdem ^^
     
  9. the_alien, 14.07.2011 #9
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Naja, du kannst ja eine App machen, nur musst du für längere Arbeiten das ganze von der GUI entkoppeln. Das müsstest du auch bei einem Applet machen, sonst reagiert auch hier die GUI nicht. Es gibt zwar keinen Fehler bei einem Applet, aber es wäre trotzdem unbenutzbar solange die Verarbeitung dauert.

    Ich würde mir überlegen ob die XML Datei nicht in eine Datenbank überführt werden kann und soll, die Abfragen hier wären deutlich performanter. Außerdem ist die Frage wie ihr die Datei bisher einlest eine 3MB XML würde sich im Speicher ziemlich aufblähen wenn ihr DOM benutzt.

    Wen ihr es möglichst einfach haben wollt nehmt die Implementation wie sie gerade ist und startet einen AsyncTask mit der Verarbeitung der Datei. developer.android.com wird hilfreich sein ;)
     
  10. Groath, 14.07.2011 #10
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Hmz. Ich lese mir gerade das hier durch: Painless Threading | Android Developers

    Nur checke ich nichts ^^ Da ist die rede von einem return Wert bei onPostExecute, aber ich will gar nichts returned haben, mein Init soll einfach nur initiiert werden, ohne irgendwas zu returnen. Das verwirrt mich gerade viel zu sehr. Soll ich dann Init zu einer AsyncTask machen? Init an sich ist ja nichtmal eine task. Init führt nichts aus. Init lädt erstmal nur die Textdatei. Und dabei gibt er nichts zurück. Mh... Hast du gerade so viel Langeweile, dass du dich auf den steinigen Weg, mir zu sagen, was ich tun soll begeben würdest? ^^
     
  11. DieGoldeneMitte, 14.07.2011 #11
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Erstmal: Eine Datei in den Speicher laden fällt durchaus schon unter "etwas tun".

    Zweitens: geht es bei onPostExecute nicht vorrangig darum, Werte zurückzugeben, sondern darum, dass man eine einfache Möglichkeit hat, den Abschluss des Jobs im GUI Thread zu machen. Ähnliches gilt für onPreExecute (oder meinst du das mit Init?)

    Normalerweise soll der Abschluss einer nebenläufigen Tätigkeit ja ein visuelles Feedback haben, und sowas ist halt nicht im nebenläufigen Thread (der doInBackground ausführt) möglich.

    Und wenn Du nix zurückgeben willst, dann nimmst du halt Void als Typ. Der onPostExecute ist dann der richtige Ort um einen "Bitte Warten..." Progressdialog zu beenden. (Denn das ist ja GUI :)

    Du kannst anstatt AsyncTask auch einen "normalen" Thread nehmen und alles, was die GUI betrifft, per Handler erledigen. Das macht das aber nicht wirklich einfacher :D

    (Moral: löse dich von der Annahme, dass alle Methoden eines Objektes vom selben Thread ausgeführt werden)
     
    Zuletzt bearbeitet: 14.07.2011
  12. Groath, 19.07.2011 #12
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Moin,

    ich bin gerade in der Türkei im Urlaub, deswegen habe ich nicht mehr geantwortet.

    Init lädt zwei Daten in den Speicher, dies sollte aber nebenher laufen und für den nutzer unsichtbar sein. Währenddessen klickt man sich durch ein Menü, gibt ein Wort in SAMPA ein und bei 'Go' sollte Init die Dateien geladen haben und dessen Methoden sollten zum weiteren Aufruf bereit sein. Ich werde das in den nächsten Tagen mit den AsyncTasks versuchen und falls es nicht klappt oder beim erfolgreichen Starten melde ich mich wieder.

    Vielen Dank für die bisherige Hilfe :)
    Görkem
     
  13. Groath, 22.09.2011 #13
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Moin :)

    Da bin ich wieder. AsyncTask läuft. Hab mir eine Seite anzeigen lassen, wenn der AsyncTask fertig ist.
    Mein Problem besteht nur darin, dass Eclipse bzw. Android die Datei noch immer nicht findet. Die FileNotFound Exception lässt mich nicht in Ruhe.

    Per DDMS habe ich meine Datei Arpa_Sampa_Table.txt in den Ordner sdcard/Data/ getan und die Datei mit

    f=new FileReader("sdcard"+File.separatorChar+ "Data"+File.separatorChar+"Arpa_Sampa_Table.txt");

    gelesen. Nur findet Eclipse diese Datei nicht und haut mir deshalb bei

    b=new BufferedReader(f);

    das Programm um die Ohren.
    Ist der Dateipfad falsch? Bin ich blöd? Ich finde nur leider nirgends einen Hinweis auf den richtigen Dateipfad.

    Dann kam meinem Kumpel die Idee, dass wir das auf einen Server tun könnten. Sein Laptop ist der Server und unsere Android GUI schickt ein Objekt als Bitstream an diesen. Der Laptop liest ihn, wandelt ihn in das Objekt um, arbeitet damit und schickt uns eine Map als Bitstream zurück, welche wir in eine Map decoden und dann ausgeben. Inwiefern ist das realisierbar? Gibt es dazu einen Thread? Hab eben schon gesucht, nur finde ich auf die Schnelle nichts, um Programmteile auf Server auszulagern und dort laufen zu lassen.

    Wenn das mit dem Dateipfad nicht klappt, müssten wir das wohl so machen befürchte ich. nur bin ich in Sachen Java Webserver ein blutiger Anfänger.

    Danke und liebe Grüße,
    Görkem

    Edit: Das Leerzeichen bei .txt existiert eigentlich nicht. Ich krieg es nicht weg, da es beim Editieren nicht vorhanden ist, beim Post dennoch da O.o
     
  14. Fr4gg0r, 22.09.2011 #14
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    wie wärs mit einem / am Anfang oder meinetwegen auch File.seperatorChar^^
     
  15. Kranki, 22.09.2011 #15
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Einmal das und zum anderen sollte man "/sdcard" sowieso nicht hardcoden, weil dieser Mountpoint nicht garantiert wird und die Sd-Karte auf manchen Geräten womöglich ganz woanders liegt. Man sollte den Pfad über die Api holen mittels Environment.getExternalStorageDirectory().getAbsolutePath().
     
  16. Groath, 23.09.2011 #16
    Groath

    Groath Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.07.2011
    Alles klar. Ich verstehe meinen Fehler. Nur ist mir Eclipse nun auf dem Rechner abgeschmiert und eine Neuinstallation bringts auch nicht mehr. Es aktualisiert keine Dateien mehr, startet das Programm nicht, weil es einen Fehler gebe, der aber nicht vorhanden ist. Das Projekt hat ein rotes X, aber keine einzige Datei oder Package im Projekt.
    Nun bin ich am Netbook, aber da ist das Problem, dass die sdcard schreibgeschützt ist - weshalb auch immer. Nun habe ich die Dateien in /data/data/AULDA/ getan und er findet sie ordnungsgemäß.

    Nächstes Problem: Das Erstellen des Dictionaries dauert auf dem Android 3,25 Minuten. Das ist nicht gerade schnell. Danach stürzt das Programm ab.

    Also nochmal die Frage: Können wir das Layout auf dem Android belassen und die eigentliche Arbeit auf einen Server auslagern? Als Server würden wir dann einfach einen ans Internet geschlossenen Laptop benutzen. Dieser soll dann das Programm mit Dictionary laden und in Endlosschleife (?) auf einen Aufruf des Androids warten. Die Methode des eigentlichen Programms würde dann ein String[] benötigen, das aus drei Einträgen besteht und eine LinkedList zurückschicken. Ist das realisierbar? Wenn ja, wie?

     
  17. Kranki, 24.09.2011 #17
    Kranki

    Kranki Ehrenmitglied

    Beiträge:
    3,831
    Erhaltene Danke:
    814
    Registriert seit:
    19.07.2009
    Tablet:
    Samsung Galaxy Tab 3 7.0 Lite
    Project -> Clean schon versucht?

    Kann man mit einem WebService sicher machen. Schonmal Google AppEngine angesehen als Alternative zum selber hosten?
     

Diese Seite empfehlen