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

Temucin

Temucin

Neues Mitglied
6
Hallo alle miteinander,
Ursprünglich komme ich aus der Basic ecke (PureBaisc) des Programmierens. Das schon recht lange ,daher bin ich wahrscheinlich nicht so einfach davon zu überzeugen, andere arten der Programmierung zu verinnerlichen. Nu ist es aber so, das ich eine App schreiben muss, da derjenige der das bisher für teures Geld gemacht hat dieses Project nicht mehr weiter führt. Also habe ich vor 10 Tagen angefangen die App mit Android Studio neu zu Bauen. Das Thema ist Arduino,Arduiond,BlueThooth und Datenlogging. Dazu gibt es fiele Beispiel und Erklärungen. Das Internet ist voll davon. Und fieles funktioniert nicht. Ausser-dem habe ich mir Bücher von Rheinwerk besorgt. Und nachdem ... 10 Tage Später die Grundzüge der App laufen. Und ich mich echt betrogen fühle . Macht es sogar manchmal Spass. Aber ich muss für mich feststelle .... ich hasse Java!!!!

Aber es führt kein weg daran vorbei .. ich muss es lernen!!!!

Die Situation:

Eine Activity A ruft eine Statische Methode aus Activity B auf. Um in Activity B Daten anzeigen zu lassen von Activity A. !! Kein Problem.
Nun kann ich aber aus einer Statische Methode heraus keine Nichtstatische Methode der gleiche Klasse aufrufen. Das ist mein jetziger Wissenstand. Ich lerne im übrigen nicht durch lesen sondern durch probieren.
Mir würde es schon reichen wenn es eine Möglichkeit gäbe. Der Activity B mitzuteilen. Hallo ..... da hat gerade jemand die Statische Methode X verwendet..... Mach was. Ich finde leider keinen Ansatz. Was mich erstaunt. Da ja mit den onClickLisserner() auf Ereigniss reagiert wird. Da muss es doch noch andere Möglichkeiten geben.

Ich wäre um jeden Denkanstoss froh.

MfG Temucin alias TFT
 
Hallo TFT,

herzlichst willkommen im Forum.

Vorweg : Statisch ist GAAAANZ schlecht :) So was sollte man tunlichst vermeiden , da Android seine Eigenschaften hat.
Das jetzt im Einzelnen zu erklären , würde den Rahmen sprengen. :)

Mir würde es schon reichen wenn es eine Möglichkeit gäbe. Der Activity B mitzuteilen. Hallo ..... da hat gerade jemand die Statische Methode X verwendet

Die einfachste Möglichkeit ist , einen BroadcastReceiver zu verwenden.
Dieser wird in Activity B gesetzt und ein Intent "versendet" aus Activity A .
BroadcastReceiver | Android Developers

Vergleichbar unter C mit einem systemweiten Interrupt.

Wenn du damit nicht zurecht kommst - Melden
 
Zuletzt bearbeitet:
Hallo.....

ein Ansatz ... eine Idee .... Danke schon-mal.
 
Hallo Temucin,

ich würde keinen BroadcastReceiver verwenden. Normalerweise übergibt man Daten im Intent mit, wenn man Activity B öffnet. (Sending Data Between Activities in Android)
Wenn du gerade erst anfängst mit Android-Programmierung, könntest du dir auch Fragments ansehen. Wir wissen ja nicht, wie du vorhast deine App architekturtechnisch zu bauen.
 
  • Danke
Reaktionen: swa00
Moin Kardroid,

ich wollte bewusst ihn nicht darauf stossen , da er dann wiederum sein Intent-Handle umsetzen und sein LifeCycle beachten muss :)

So wie es aussieht , hat er ja seine Activity B irgendwie schon losgetreten.
Er kommt ja von Basic und hat den Ablauf nach 10 Tagen noch nicht so gut drin.
 
kennt jemand zu dem Thema etwas auf Deutsch ?
[doublepost=1524034793,1524034650][/doublepost]Ja ... die Activity B läuft ...... ich brauche die Daten zur Laufzeit. Wobei ich nur einen Stupser brauche, denn die Daten holen kann ich ja. Aber warum ist Statisch schlecht?
 
kennt jemand zu dem Thema etwas auf Deutsch ?

Nicht das ich wüsste , was im ABLAUF dir wirklich weiterhilft.
Wirklich informativ ist nur die englische Sprache

Unsere Spielwiese :
Stack Overflow - Where Developers Learn, Share, & Build Careers


Der Punkt ist , dass Android nicht gleich Java ist und sehr Threadlastig arbeitet.
Statisch - so wie du es aus Basic kennst - kennt man praktisch nicht
und nun kann ich mir vorstellen , dass du Interupts/Listener durch die Gegend schieben magst
und auf Ereignisse reagieren möchtest - stimmts ?

Stellt sich als erstes hier die Frage : Warum willst du B mitteilen , dass jemand auf A was ausgeführt hat ?
Nur eine Activity ist im Moment im Vordergrund , deshalb verstehe ich den Sinn nicht
 
Zuletzt bearbeitet:
swa00 schrieb:
ich wollte bewusst ihn nicht darauf stossen , da er dann wiederum sein Intent-Handle umsetzen und sein LifeCycle beachten muss :).

Aber genau darum sollte es bei einer App gehen. Man muss nun mal den LifeCycle beachten. Wenn man ihn nicht direkt am Anfang beachtet, wird es irgendwann so wuchern, dass es nicht mehr klar ist, wer jetzt was schickt und wer was wann verarbeitet etc.

Edit: Und ich möchte jetzt nicht auf meine vielen Stunden Debugging meines Speicherlecks eingeben, nur weil ich eine Variable eines anderen Screens nicht "leer gemacht habe" und beim Schließen des Screens der GC nicht angesprungen ist...
 
  • Danke
Reaktionen: swa00
@Temucin

bevor wir hier weiterrätseln :

Wie Kardroid es schon oben erwähnt hat :

Sei so lieb und erkläre mal detailliert , was du basteln möchtest - Dann kommen die Antworten auch gezielter :)
 
Zuletzt bearbeitet:
Ich versuche mich mal an einer Erläuterung.

Die MainActivity startet einige Threads , unter anderem BlueTooth Empfangs-Stream. über einen mHandler ( CallBack ???) werden die Daten die kommen in der
MainClasse weiter verarbeitet. Zum beispiel in einem Statischen StringArray gespeicht. Jeder empfangene String aus dem Stream, wird an die Activity B , wenn sie dann activ ist in einem TextView angezeigt. Quasie ein ChatLog. Wird Activity B gestartet. Holt es sich die Daten aus dem String Array um den Chatlog auf den Aktuellen Stand zu inizialisieren. über den Stream kommen befehle um zum beispiel die Hintergrundfarbe des ChatLog zur Laufzeit zu ändern. Dann muss ich von Activity A aus ( Das ist in dem Fall wahrscheinlich falsch formuliert , da diese ja nicht mehr Existiert), Activety B mitteilen das er die Hintergrund Farbe ändern soll. Bei start der Activety B kann ich die neue Hintergrund Farbe ja holen. Aber zur Laufzeit würde das bedeuten die Activity Neustarten zu müssen um die änderung zu aktualisieren. Die Sache mit den lebens Zyklen habe ich denke mal verstanden. Solange die MainActivity nicht Destroid wird. Laufen auch die Threads weiter.Ich müsste das was ich bisher habe komplett umbauen. Wenn ich für jede Activity beim wechsel jedesmal die Verbindung zum BT Modul neu aufbauen muss. Da permanent Daten komme, würden so einige verloren gehen. Denke ich mal.

In der Hoffnung meine Gedanken in passende Worte gekleidet zu haben.

Gruss Temucin
 
Kurz - bis ich wegmuss :

Dein Ansatz ist schon mal ganz gut , allerdings nicht das was du möchtest.

So wie ich das sehe , benötigst du nur eine Activity, die das UI darstellt.
Alles andere solltest du OOP mässig in Klassen auslagern und dynamisch arbeiten .

Darin verarbeitest du Listener/Callbacks , die du in die Activity einbettest.
Denn ganz wichtig , den UI THread musst du gesondert behandeln und freilaufen lassen.

Die "Statischen" Strings solltest du vermeiden , nimm dazu ein dynamisches Array ( ArrayList)

Möchtest du globale Variablen übergeordnet behandeln , so solltest du dir eine
Singleton Klasse anlegen.

Wichtig , gerade bei BT musst du soweit wie möglich alles in Threads und Listener
auslagern - BT ist tricky, wenn es stabil laufen soll.
 
Zuletzt bearbeitet:
Hallo...

nochmal kurz dazu was das ganze werden soll. Beziehungsweise was es in der Bereits Funktionierenden Version ist.

Erstens ... ein Terminal Programm, das Daten von der BlueTooth Schnitstelle holt und sendet , und in einem TextView anzeigt.
Zweitens ... diese String Daten enthalten Anweisungen um eine Steuer Oberfläche zu generieren die in einem Canvas dargestellt werden sollen.
Drittens .... Interactionen wenn das Canvas sichtbar ist, werden als Daten gesendet. Die Objecte die angezeigt werden sind Dynamisch steuerbar.
Fiertens .... Die Daten im Chatlog sollen Gespeichert und versendet werden könne. Via SMS , EMail oder als HTML Dokument.

Das im Groben. :)
 
Nachtrag zu oben - Erst recht bei Canvas so vorgehen , wie ich beschrieben habe.
Rendering unter Canvas benötigt resourcen.
 
Ich habe jetzt mal versucht, Mich mit dem BroadcastReceiver zu befassen. Dazu gibt es im Buch 2 Seiten zu lesen. Ich habe selbst nach
10 mal lesen keinen Plan wie das gehen soll. Damit könnte ich auch leicht die Statik Sachen ändern. Die MainActivity hat bereits einen
BroadcastReceiver , allesdings wird er nie aufgerufen und wird ziemlich anders erzeugt als in meinem Buch und scheint an das BT Device gebunden zu sein.
 
Und Deine Frage dazu wäre ?
Wo hängst du ?

Brauchst du ein Beispiel ?
 
Das war jetzt nicht meine intension nach Beispielen zu schnorren. Aber wenn du mich so fragst. Ich brauche ein greifbares Beispiel. Damit ich das Lernen kann.

MainActivity, hat einen BroadcastReciver , er reagiert auf einen Intend vom Type "msg" und die Daten sollen als String empfangen werden und als LOG.d("TFTlog",EmpfangenerString) ausgegeben werden. Der Broadcast muss auch funktionieren wenn das MainActivity nicht Existiert. Alle 1000 ms wird ein Intent an die ConnectActivity gesendet, wenn diese Activ ist, auch wenn die MainActivity nicht existiert.,. Dieser setzt sich aus folgendem String zusammen. "MainActivity"+Aktuelle Millisecs()". Es gibt einen Button mit dem man zur ConnectActivity wechseln kann. Ein Reset der MainActivity darf den Resiver nicht beänden. Oder muss Ihn neu starten. Ein Button "Reset" resettet die Activity. Der Reciver kann auch auf die System Nachricht Battary Low reagieren. Inclusive der Anpassungen der Manifest Datei.

ConnectActivity, hat ebenfals einen BroadcastReciver. Dieser startet bei onCreat() und endet bei Destroy(). Er reagiert auf einen Intend vom Type "msg" und die Daten sollen als String empfangen werden und als LOG.d("TFTlog",EmpfangenerString) ausgegeben werden.Und sendet bei betätigen eines Button "Senden"einen Intent mit einem String "ConnectActivity"+Aktuelle Millisecs()". Wird die Activity verlassen wird auch der Reciver beändet. Wird die Acivity Resettet muss der Reciver weiter laufen oder neu gestartet werden. Ein Button "Reset" resettet die Activity. Ein Button Return sowie die ReturnTaste am Handy beändet die Activity, nicht die App.

Ein solches Beispiel würde sehr helfen , den Umgang mit BroadCast zu verinnerlichen.

Grusss Temucin alias TFT
 
Moin TFT ,

sei so lieb und poste mal die wichtigen Elemente als Source , damit wir in der gleichen Richtung speilen.
Also was hast du schon ,was geht nicht und warum und wo .
 
mmmm, ich hänge mal das an, was ich bisher gemacht habe. Es ist der stand bevor ich mit meinen Broadcast versuchen begonnen habe. Da ich nicht weis was wichtig ist .... gibt es alles :) aber das ist im Moment ja noch nicht wirklich fiel.

Gruss Temucin alias TFT
 

Anhänge

  • TFT_ActionBar_Test_001.zip
    19,2 MB · Aufrufe: 86
Hallo TFT,

ich habe mal deinen Source quer gelesen - besonders die MainActivity.
Für deine 12 Tage biste aber schon recht weit :)

ABER - (Nimm es mir nicht übel) Dein Aufbau ist typisch Basic, Spaghetti like :)

So wie du das aufbaust , kann es leider nicht funktionieren - als Beispiel nenne ich dir mal,
dass du den Adapter des Views in die MainActivity implementierts, und darin im Clicklistener noch einen Thread startest.
In diesem bekommst/erwartest du eine Message - oder machst eine Connection auf.

Der Punkt ist aber , dass die UI schon längst weiter ist , denn es ist einen eigener Thread.
Deine Applikation wartet also nicht eindeutig auf die Eregnisse und befindet sich dadurch im Nirvana.

Das ganze BT geraffel, den AdpaterView und alles was Zeitlich kritisch ist musst du in gesonderte Klassen
auslagern , davon eine Instanz in der Main bilden und diese in Ruhe wackeln lassen.
Wenn BT dann einen eindeutigen Status hat , erst dann - und nicht vorher - schickst du was an die Main und reagierst drauf.
Das kannst du entweder mit einem Broadcast machen oder - besser mit Listener.

Android ist Threadlastig und äusserst sensibel, wenn man auf Funktionen inner Funktionen wartet.

Solltest du Datenergebnisse global benutzen wollen , so verwendest du am besten Singleton Klassen.
Deine Verwendung von static an diversen Stellen in der Main ist hier leider falsch und beschert dir
Stacks.

Auch ganz wichtig für dich zu wissen : Android verwaltet seinen Speicher alleine .
Es kann durchaus hingehen und dir mitten im Betrieb Werte "klauen" weil es der Meinung ist , dass
es nicht mehr benötigt wird.

Die Verwendung von "static" hebt das nicht auf.

Fazit : Beschränke dich in den aktiven Activities NUR auf die UI , nicht auf Datenfunktionen oder Kommunikation.
Das sagt schon alleine das Wort "Activities"

Deklariere Funktionsklassen , die die Arbeit machen und nur dann was an die Activity schicken , wenn es nötig ist.

Ergo : Du musst leider erst mal gründlich nach OOP aufräumen
 
Zuletzt bearbeitet:
Hallo,

erstmal danke das du dir die Mühe machst. Daher wäre es vermessen auf Kritik und Anregung mit übelkeit zu reagieren.

Das mit dem "Kann nicht funktionieren" widerspreche ich in sofern ,.... das die App ja Funktioniert. Und bissher kein Fehlverhalten
an den Tag gelegt hat.

----
So wie du das aufbaust , kann es leider nicht funktionieren - als Beispiel nenne ich dir mal,
dass du den Adapter des Views in die MainActivity implementierts, und darin im Clicklistener noch einen Thread startest.
In diesem bekommst/wartest du eine Message - oder machst eine Connection auf.
----

aus meiner Sicht soll das so sein. Hängt damit zusammen das ich bisher ja eine andere Rangehensweise hatte. Das dies aus Sicht eines
Java Entwicklers falsch umgesetzt ist. Kann durchaus sein. Das meiste davon ist aus dem Internet .... also habe ich Fehler dritter übernommen.

Da kommen jetzt die Broadcasts ins spiel ...... aber leider muss ich hier mal unterbrechen .... ein Nebenjob klingelt gerade an der Tür. Ich werde das aber weiter ausfüren

Gruss Temucin alias TFT
 

Ähnliche Themen

Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.107
Helmut1A
Helmut1A
R
  • RudolfHagen
Antworten
1
Aufrufe
629
koje71
koje71
S
Antworten
4
Aufrufe
944
Sempervivum
S
Zurück
Oben Unten