Schnittstelle zwischen Java-Programm und Android GUI fehlerhaft

G

Groath

Neues Mitglied
0
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
 
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?
 
Groath schrieb:
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?
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.
 
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?
 
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?
 
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.
 
Groath schrieb:
Nun kommt nicht mehr diese Fehlermeldung, das Programm reagiert einfach nicht mehr. Schwarzer Bildschirm bis die Meldung: Activity AULDA_4 is not responding.

Du gibst dir die Antwort doch selbst:
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?
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?
 
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 ^^
 
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 ;)
 
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? ^^
 
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:
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
 
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
 
wie wärs mit einem / am Anfang oder meinetwegen auch File.seperatorChar^^
 
Fr4gg0r schrieb:
wie wärs mit einem / am Anfang oder meinetwegen auch File.seperatorChar^^

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().
 
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?

 
Groath schrieb:
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.

Project -> Clean schon versucht?

Groath schrieb:
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?


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

Ähnliche Themen

D
Antworten
23
Aufrufe
2.533
Data2006
D
H
Antworten
2
Aufrufe
1.309
Hcman
H
M
Antworten
4
Aufrufe
1.171
swa00
swa00
Zurück
Oben Unten