Classen Methoden ,deren Aufruf und meine Anfänger Probleme. HILFE !!!

  • 37 Antworten
  • Letztes Antwortdatum
Hallo TFT,

ich kürze es mal ein wenig ab .

Natürlich können wir jetzt nicht hingehen und dein ganzes Konzept einmal durchspielen .
Dazu müssten wir ja deinen Hardwareaufbau auch nachspielen.

Ich kann nur das weitergeben , was mir aufgefallen ist und ich als kritisch ansehe.
Und kann nur Tips geben , wie es stabiler umgesetzt werden soll, damit auch "Ordnung" herrscht.
Es ist also keine Kritik an der Arbeit ansich , sondern am Aufbau , der halt leider nicht Konform ist
und wie es auch die API's vorschreiben/ empfehlen.

Deine Broadcasts sind insofern auch recht gut deklariert, da ist nichts verbesserungswürdig.
Ich vermute einfach , dass diese durch deinen Aufbau schlichtweg ins Nirvana laufen.
Bedingt durch deine "Vermischung" von Threads, Abhängigkeiten und "globalen" Variablen.

Auch wenn du logs ausgibst - Debugge mal das Ganze STep STep, dann wirst du
wahrscheinlich schon sehen , dass du ganz woanders bist , als vermutet

Good Luck
 
  • Danke
Reaktionen: Kardroid
Hallölle ....

Abkürzungen finde ich grundsätzlich nützlich. Allerdings sind diese beim lernen von Komplexen Sachverhalten eher fatal.
Ich habe deine Erläuterungen auch nicht als Kritik an meine Bemühungen gesehen. Ganz im gegenteil. Ich bin froh wenn
jemand ehrlich seine Meinung sagt. In den letzen Jahren beobachte ich, das der Umgang miteinander im Internet sehr salzig geworden ist.
Also .. in diesem sinne danke für deine Bemerkungen. Ich werde schauen ob ich das so umsetzen kann.

Aber jetzt mal was anderes ..... du würdest nicht zufällig für eine Hand voll Dollar eine Demo Schreiben so wie bei den Jobs von mir
gepostet? Daraus könnte ich ersehen wie so ein Broadcast richtig funktioniert und auch gleich so ein bissel das drum herum.

Einen schönen Abend wünsche ich noch .. Gruss Temucin alias TFT
 
  • Danke
Reaktionen: swa00
Und ein nettes "Hallo" zurück ....

Aber jetzt mal was anderes ..... du würdest nicht zufällig für eine Hand voll Dollar eine Demo Schreiben so wie bei den Jobs von mir
gepostet? Daraus könnte ich ersehen wie so ein Broadcast richtig funktioniert und auch gleich so ein bissel das drum herum.

Die Wartezeiten für neue Aufträge sind derzeit bei mir sehr sehr lange - das tut mir leid.
Ich hoffe, dass sich jemand für dich findet, möchte dich aber nicht zu sehr in Euphorie wiegen.

Notfalls kannst du auch mal hier nachschauen, oder einstellen.
(Ich persönlich kenne das Portal nicht)
Anfragen zur Programmierung von Apps

Viel Glück
 
Hallo @Temucin,

man sieht dem Code an, woher du kommst. Der Art zu programmieren kommt mir bekannt vor. ;) Habe seit kurzer Zeit die magische Zahl 50 erreicht, und meine erste Sprache war BASIC. :)

Broadcastreceiver: Broadcast Receiver in Android - Big App (Am besten benutzt du den LocalBroadcastManager)

Bevor Du weiter machst, solltest Du Dich unbedingt mit Streams beschäftigen. Das Programm öffnet mehrere Streams, es muss sie auch schließen. Android hat zwar ein Collector, der den Speicher aufräumt. Aber das macht der erst, wenn die App den Speicher wieder freigibt. Wenn nicht, richten sich die Objekte wohnlich im Speicher (Heap) ein, und entwickeln außerdem gerne ein reges Eigenleben,
Soweit ich das sehe, wird deine App bei längeren Betrieb mit einem ARN abstürzen (ANRs | Android Developers).

Android hat einen Lifecycle, denn brauchst man, um den Speicher ordentlich aufzuräumen.
The Activity Lifecycle | Android Developers

Noch ein Nachwort zu den Bemerkungen von Swa00. Ich habe schon ein paar IoT - Apps in Android programmiert. Und er trifft mit seinen Bemerkungen ins Schwarze. Android setzt massiv auf nebenläufige Programmierung, und der Teil fehlt in BASIC. Und du wählst keine andere Vorgehensweise, sondern ignorierst diesen Teil von Android komplett. Threading und IPC sind ein extrem komplexes Thema, und leider wirst du im Netz sehr viele Beispiele finden, die falsch umgesetzt worden.

Multitasking – Wikipedia
Interprozesskommunikation – Wikipedia

Und bevor du glaubst, wir wollen dich nur ärgern. Das Thema kocht hier im Forum immer mal wieder auf, und hat mir schon viele schlaflose Nächte verschafft. Ich habe schon mal eine Firma deswegen pleite gehen sehen. ;)

Ich weiß nicht, wie viel Zeit du für die App veranschlagt hast. Ich vermute aber stark, dass da noch viel Arbeit fällig ist.
 
  • Danke
Reaktionen: swa00
Hallo,

Was die Streams anbelangt ...... so denke ich wird jeder Stream geschlossen sobald beim Aufruf, eine Exeption geworfen wird, und mittels Try/Catch dann die Close Funktion aufgerufen . Ist zwar kein schöner Stile ..... aber die App läuft jetzt seid 4 Tagen. Ein Absturts wäre fatal..... da muss ich mich nochmal damit befassen.

Die BigApp Seite habe ich gerade selber beim Suchen gefunden. Aber es macht keinen sinn einen Intent senden zu wollen wenn die Activity nicht läuft. Da muss ich was machen mit einem Thread. So wie der Empfangs Thread für den Stream, der ja unabhängig von der Activity läuft und auch nur bei einer Exeption beändet wird.

Mir ist bewusst ... das die App keine KlickBy Sachen ist. Aber ich weigere mich deswegen die Flinte ins Korn zu werfen.

Was das ignorieren anbelangt ...... ja ... ich denke das Schwarze ist richtig tief dunkel Schwarz :) Aber das ist nun mal so, wenn man keine Ahnung hat. Wenn ich die fielen Beispiel im Internet sehe, und dann hier gesagt bekomme das ich eigentlich die Sachen nicht so machen sollte. Dann kommt in mir der Verdacht auf, das zu fiele Schwachmaten zufiel Unsinn schreiben.

Und Zeit .... ich habe einfach angefangen. Mal sehen wie lange es dauert. Der Schwere Teil kommt ja erst noch. Die Implementierung des CanvasActivity...... Das mache ich nur für mich, damit ich meiner Arduino Steuerung eine Coole Benutzer Oberfläche verpassen kann.

Gruss Temucin alias TFT
 
Dann kommt in mir der Verdacht auf, das zu fiele Schwachmaten zufiel Unsinn schreiben.

Yupp, so ist es .. Und die wenigen Guten sind i.d.R. veraltet oder hängen der aktuellen API nach : fatal

Halte dich lieber an unsere Spielwiese, die ich dir oben als Link geschickt habe.
Zwar muss man gutes Englisch verstehen (sehr oft Native-Slang) aber Diese helfen uns am Meisten

Abgesehen von der API , die wir selbstverständlich VORHER studieren , bevor wir Stackoverflow bemühen.
Da stehen auch die Sachen , die wir dir oben - auf Deutsch - erklärt haben.

Im Prinzip waren unsere Tips nur eine übersetzte Zusammenfassung - also nicht Schwarz , sondern hell Weiss.
Sie müssten dich eigentlich blenden :)
 
Zuletzt bearbeitet:
Oh . das haben sie ...... geblendet. Daher werde ich mal das Rad für mich neu erfinden und hier gelegentlich
Posten. Wie meine Versuche den Richtigen Weg zu finden Früchte Tragen. Wäre dann über jeden hinweis froh.

Also gleich mal eine Sache. Wenn ich Global Variablen oder Daten verwenden will. Sollte ich das in einer separaten Classe
auslagern, damit von allen Seiten darauf zugegriffen werden kann. Mit Getter und Setter und son gedönse. Nun bin ich was
MultiThreading anbelangt kein unbeschriebenes Blatt. Der Zugriff auf Globale Variablen hat immer das Problem das man
den Zugriff durch Zuweisung einer Berechtigung steuern muss. Damit nicht Threads gleichzeitig darauf zugreifen. Unter Windows
gibts es dazu Semavoren, Der Name kann falsch sein. Gibt es unter Android auch einen solchen Mechanismuss, oder muss ich mich
selber darum kümmern.
Und als 2. .... wenn ich das richtig Verstanden habe, sollte ich in der MainActivity .. oder generell in Activitys nur auf Ereignisse
reagieren und die Arbeit, wenn nötig in einer anderen Classe erledigen.

Wenn ich total falsch liege ..... nicht mit Eiern sondern mit Erkentniss werfen :)

Gruss Temucin alias TFT
 
Moin ,

Also gleich mal eine Sache. Wenn ich Global Variablen oder Daten verwenden will. Sollte ich das in einer separaten Classe
auslagern, damit von allen Seiten darauf zugegriffen werden kann

Nein, dafür muss eine Singleton- Klasse her. Getter und Setter kannst du verwenden,
Performance-Technisch nicht zu empfehlen.
Schau dir dazu mal die bestehende Implementierung der Klasse "Application" an .
Application | Android Developers



Damit nicht Threads gleichzeitig darauf zugreifen. Unter Windows
gibts es dazu Semavoren,
Gibt es unter Java nicht in dem Sinne , deshalb am Besten mit Listener arbeiten.
Die kommen Systemintern in eine FIFO-Queue.
Vergleichbar unter Windows / Linux löse ich das mit C/C++ und Fork-Interrupts



Und als 2. .... wenn ich das richtig Verstanden habe, sollte ich in der MainActivity .. oder generell in Activitys nur auf Ereignisse
reagieren und die Arbeit, wenn nötig in einer anderen Classe erledigen.

Richtig, denn die UI ist ein eigener Thread.
Communicating with the UI Thread | Android Developers


Tipp: Zieh Dir mal am Wochenende beim Grill die API Dokumentationen rein und
erstelle Dir mal NUR eine Sample App mit SingleTon, AsyncThread und Listener.

HInweis - Threads im "Dauerbetrieb" (gibt es eh nicht unter Android) sollten nicht mit AsynThread umgesetzt werden.
Zum Üben aber hilfreich.
 
Zuletzt bearbeitet:
Ich bin ja voll auf JAVA ... :) wärend ich so experimentiere und im Internet recherschiere. Kam mir der Gedanke .... etwas in der Art habe ich hier gelesen.
Das 2 Activitys nicht umbedingt gebraucht werden. Vorher habe ich das nicht richtig verstanden, aber es würde ja auch reichen die View zu Tauschen oder?
Denn was anderes brauche ich ja eigentlich nicht.
 
Das mit dem View Tauschen ist nicht mal so schwer. Allerdings benötige ich 3 davon. Im Dritten muss dann der Canvas hin. Oder sollte ich dafür wirklich eine neue Activity verwenden?

Es gibt doch bestimmt die Möglichkeit den Layouts namen zu geben und mit einem Befehl das entsprechende Layout anzuzeigen. Eine Idee wie die Funktion heissen könnte ?
 
Zuletzt bearbeitet:
Du kannst

a) entweder alle ViewContainer in ein Layout packen und mit Hide und Show setzen
b) Jeweils eine Activity nehmen

Es gibt doch bestimmt die Möglichkeit den Layouts namen zu geben und mit einem Befehl das entsprechende Layout anzuzeigen. Eine Idee wie die Funktion heissen könnte ?
c) Oder eine Activity, ein grundlayout und mit Inflate und AddView zur Laufzeit deine Container hinzufügen (Deine Frage)


d) Oder eine Activity und Fragmente
e) Oder eine Activity mit PageViewer

Die verwendet Technik hängt von deiner Haptik, deinem Geschmack und von der Performance ab.

Du solltest aber dafür nach Möglichkeit kein ConstraitLayout verwenden - das ist noch zu jung (buggy)
Arbeite lieber mit Relative/Liniear
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Temucin
Die Sache mit der Performance habe ich schon öffter gehört. Ich habe jetzt 2 Jahre ein G7 Ege . Es gibt bestimmt Devices die Langsamer sind und nicht sehr reichlich ausgestattet. Aber die App bedingt quasie mehr Pover.

Hide and Show .. hört sich vertraut an. ;-)

Was sagt deine Erfahrung zum Thema Canvas....... Auch wenn es keine Game App wird. Brauche ich die Draw Funktionen und die Toutch sachen. Ist es sehr hakelig das einzubinden. Bissher ist mir noch keine Beispiel das läuft unter gekommen.

Es ist sowiso extrem komisch, das 99% aller codes aus dem Internet nicht funktionieren. Ich denke ich habe da etwas entscheidendes in bezug auf Gradel nicht mitbekommen. Beziehungsweise wie man für Verschieden SDK Programme mit Android Studio schreibt.

Einen schönen Tage und ein cooles Wochenende ..... in Zürich sind gerad 29 Grad.

Gruss Temucin alias TFT
 
Nochtrag zu meiner Kommentar. Du muss die Streams (z.B InputStream, OutputStream, BluetoothSocket, usw) immer schließen (mit close()). Auch wenn kein Fehler aufgetreten ist.
Und ja, das führt meist zu Klammer Orgien. Und dafür ist Java berühmt und berüchtigt.

Das instantiieren der Streams mmInStream und mmOutStream im Konstruktor ConnectedThread(BluetoothSocket socket) geschied am falschen Platz. Das gehört in die run() -Methode. Und der try - catch Block gehört um darfst du erst Schließen, nach dem du die beiden Streams geschlossen hast.
 
  • Danke
Reaktionen: swa00
Hallo,

ich benutze den Fehler als Kennzeichen das ich den Socket jetzt schliessen kann da der Stream nicht mehr da ist. Das hängt damit zusammen das der Stream solange offen bleiben muss !!!! Da ich ja ständig , unregelmässig Daten vom BT Stream bekomme und auswerten muss. Ausserdem wird der Stream bei längerer untätigkeit geschlossen (nicht von mir) Was zu abstürzen führt, weil natürlich die Zeiger dann ins lehre laufen. Daher so fiele Try/Cach. Allerdings muss ich noch einen Testlauf machen was die Anzahl der Aufrufe und instanzierungen anbelangt. Ich habe einige Beispiel die sehr Aufgeräumt aussehn..... aber nicht funktionieren. Aber an eine Umstruckturierung komme ich wohl nicht vorbei. Da ich JAVA richtig lernen möchte. Aber nach 14 Tagen darf man den Standart noch etwas geringer halten.

---
Das instantiieren der Streams mmInStream und mmOutStream im Konstruktor ConnectedThread(BluetoothSocket socket) geschied am falschen Platz. Das gehört in die run() -Methode. Und der try - catch Block gehört um darfst du erst Schließen, nach dem du die beiden Streams geschlossen hast.
---

Das muss ich mir nochmal genauer anschauen. Durch die Fielen Try/Catch bekomme ich natürlich Fehler nicht wirklich gut mit.

Danke für die Hinweise und ein schönes WE

Gruss Temucin alias TFT
 
Noch ein Nachtrag zu deinen Code. Habe mal mit Google gesucht, Ich habe nur leichte Varianten von dem Beispiel auf der Google Seite gefunden. Bluetooth | Android Developers
Die meisten Beispiele sind dort recht gut. Das hier finde ich grenzwertig. Hier fehlt einfach eine sinnvolle Fehlerbehandlung. Android hat die böse Angewohnheit, dass Apps ohne Vorwarnung vom System o. von User unterbrochen o. beendet werden können (Telefonanruf, Starten einer andern App über Notification, zuwenig Arbeitsspeicher usw).

Darauf muss man reagieren. Da man bei Android Threads und Streams benutzt, ist das nicht so einfach. Beides werden nicht vom GC bereinigt, sondern der Entwickler ist hier gefordert.

In deinen Fall kann der Stream erst beendet werden, wenn du die while Schleifen verlässt, und dort sollte dann auch close() stehen. while(true) ist eine Endlosschleife, das ist nicht so schön, es fehlt eine Abbruchbedingung.

Testen: Hat schon mal jemand anderes deine App getestet (ohne deine Hilfe). Ich bin mir sicher, er findet Bugs an Stellen, an denen du nicht gedacht hat (Tester können echt nervig sein :) ).
 
Hallo,

ja .. ich habe nochmal drüber geschaut. Und du hast recht. Es ist zwar richtig das der Tread beändet wird .... aber der Stream wird nicht geschlossen. Habs angepasst. 2 Abbruchbedingung habe ich doch! Wenn der mHandler oder die Streams ungültig sind .. wen die App geschlossen wurde oder der Stream abbricht gibt es eine Exeption die den Tread beändet. Sicher ... wie du schon sagst nicht wirklich schön.
Was das Testen anbelangt ... ich bin erst seit 14 Tagen an der App dran ..... ich bin froh das es überhaupt funktioniert. Ausserdem streuben sich mir bei JAVA alle Nackenhaare. Ich versuche mich gerade an Listen mit Objekten und verzweifle schier. Wenn man in einer anderen Sprache das alles aus dem FF konnte. Raubt es einem alle Nerven.
Ich habe mir inzwischen diverse Funktionen als Demo geschrieben. Weis mittlerweile auch wie ich Handler von anderen Classen aus anspreche und verwende. Das macht es mir auch möglich die BT Funktionalität in eine separate Classe zu verfrachten.

Was die Seite anbelangt .,...... die ist interesant . Aber leide ist mein Englisch einfach ... bäääää.

Und ich habe es glaub schonmal erwähnt. Nicht eines der Demos die ich im Internet gefunden habe lässt sich Compilieren. Und wenn doch ..... kommt keine Verbindung zustande. Mit dem was ich mit Copy and Past zusammen geschustert habe hat es auf anhieb funktioniert. Bisher läuft es auf einem Samsung S4 minni, S6, S7 Ega und meinem Samsung Tablet, Und dem HUWAI 10P.

Ich habe fast alle Sachen hinbekommen die ich brauche. Auch das mit dem Canvas war einfacher als gedacht. Aber Broadcast will nicht so recht. Mit CallBacks die aus einem Tread heraus gesendet werden . Könnte ich das fielleicht hinbekommen. Denn mit den msg Handler habe ich ja schon gearbeitet.

---
Vorwarnung vom System o. von User unterbrochen o. beendet werden können (Telefonanruf, Starten einer anderen App über Notification, zuwenig Arbeitsspeicher usw).
---

ist mir zwar noch nicht unter gekommen. Wenn es Klingelt geht die App in den Hintergund und wenn ich auflege hole ich Sie wider hervor. Aber ich muss bestimmte Zustände merken, damit bei widerstart der App diese an den Abruchpunkt wider beginnen kann. Das halte ich jetzt durch die Lebenszyklen für nicht all zu schwer.

Was mir wirklich Sorgen bereitet ist , das ich schwierigkeiten habe ,die für mich sonst einfachen sachen, umzusetzten.

Ein Beispiel.

In einer Classe lege ich eine Methode an. Die ich als Strucktur Speicher verwende. Ich kann damit Objecte erzeugen, Daten Speichern und abrufen.
Nun muss ich dies Objecte in einer Liste zusammenfassen, damit man nach ID oder anderen Elementen suchen kann. Also habe ich es mit ArrayList und
ListIterator versucht. Aber ich bekommen ums verrecken nicht den richtigen Handler zurück um auf die Elemente zugreifen zu können.. Ich werde also wider eine Demo machen müssen die sich dem Thema annimmt.

Es gibt fiel Hun ... braten wiers an.

Gruss Temucin alias TFT
 
Ich kenne das Gefühl :) . Hatte ich auch.

Meistens stürzen die Apps nicht sofort aus, sondern später (Wenn der Speicher überläuft). Zum anderen existiert der Programmcode noch im Speicher, und wenn du sehr viel Pech hast, kann der Code wieder aktiv werden, und die Werte verändern.
So etwas zu finden ist relativ schwer, da man die Ursache nicht ohne weitere sieht. In Fachkreisen nennt man solche Bugs Heisenbugs. Sie treten völlig wahllos auf.

Wenn du eine Arraylist benutzt, ist das recht einfach. Am einfachsten geht es mit ein For Each Schleife.

Code:
ArrayList <Data> dataList = new Arraylist();
....
int id = 2;

boolean isFound = false;

for  (Data data : dataList) {

if (data.id == 1) 
    isFound = true; 
   break;
}

if (isFound) {
// DOTO
}

Wenn es sehr viele Daten oder komplexe Anfragen sind, kannst du SQLite benutzen. In Suchen von Daten ist SQL immer noch die beste Wahl.
 
Zurück
Oben Unten