Textdatei in internen Speicher downloaden

  • Antworten:170
  • Bentwortet
patrickk83
  • Forum-Beiträge: 93

17.05.2020, 19:48:09 via Website

Naja, die Berechnung dauert schon etwas da es insgesamt 76 Satelliten sind und die Berechnung relativ komplex ist. Hier werden dann die benötigten Daten für das ListView berechnet (Datum, Elevation, Uhrzeit, etc.). Das Listview möchte ich dann bezogen auf die aktuelle Uhrzeit immer wieder aktualisieren. Die Berechnung wird grundsätzlich einmal nach jedem kompletten Neustart der App durchgeführt bzw. in gewissen längeren Zeitabständen (die Textdateien sind immer 30 Tage gültig). Und auf die berechneten Daten muss ich dann öfters zugreifen. Und die Daten müssen immer im Bezug auf den jeweiligen Sat-Namen gespeichert werden.

— geändert am 17.05.2020, 19:49:07

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.957

17.05.2020, 19:53:38 via Website

Du könntest eine Datenbank erstellen, und dann die Werte zwischenspeichern. Beim Aktualisieren, wird die Datenbank-Tabelle gedropt und neu befüllt. Das würde dann heißen, dass nach 30 Tagen die App länger zum laden braucht.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
patrickk83
Kommentieren
patrickk83
  • Forum-Beiträge: 93

17.05.2020, 19:55:57 via Website

Danke, werd mal sehen was ich so im Netz finde.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

18.05.2020, 13:52:04 via Website

Hallo

Die Klasse Model hat jetzt für einen Satelliten die einzelnen Variablen gespeichert. Ich müsste aber für jeden Satelliten diese Zerlegung durchführen und speichern. Dies ist nämlich die Basis für die spätere Berechnung. goes here

Das ist ja richtig aber die einzelnen Satelliten sind Inder Klasse Modells.

Dort ist eine dunamische Liste die widerung alle einzelnen satelien in ihren Model Kasse hält.
Es giebt also eine Klasse Models in ihr 76 Klassen Model. Für jeden Satelit eine eigene Instanz Objekt der Klasse Model. Beachte das s am Ende.

Glaube du hast das Prinzip noch nicht verstanden was Ludy hier macht.

In der Klasse ReadTxtFile bearbeitet er ja schon einen Teil der Daten.
Wieso packst du dort nicht auch den Rest der Bearbeitung rein?

Dann hast du alle aufgeschlüsselten Daten in der Model Kasse und auch alle Sateliten in der Models Klasse.

Frage wie sieht denn deine sogenannte aufwendig Bearbeitung aus?

Denn in der HamSatMenu Activity wird es ja Liste der Klasse Models eingelesen und schon etwas bearbeitet. Durch den Aufruf der ReadTextfile Methode. In einer Schleife. Das dauert bei mir nicht sehr lange.

Wo durch was ist hier deine Warte Zeit.

— geändert am 18.05.2020, 15:08:11

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

18.05.2020, 17:21:26 via Website

Hallo also irgendwie ist das alles verirrend.

In der Main Activity lädst du schon mal die Datei runter. Wieso noch mal in der Hamsatmenu?

Du willst die daten scheinbar in allen Activitys zur Verfügung haben. Richtig ?

Da für würde ich einen etwas anderen weg gehen als immer wider die Datei runter zuladen und neu berechen zu lassen.
Ich würde die Models Klasse zu eine Singleton Klasse machen in ihr dann die speichern. Machst du eigentlich schon fast. Da es nur eine Instanz dieser Kasse geben kann kannst du die die Instanz der Kasse in jeder Activity holen und die Daten Lesen bearbeiten.

So nun zu deiner MainActivty was soll das eigentlich das du die Berechnungen aller Satelliten in den static SharedFunctions Variablen speicherst. Du gehst die in der Methode
startDownloading() alle Satelliten durch. In der For Schleife solltest du deine berechten werte auch in den einzelnen Model speichern. Da zu wollstest du eigentlich deine TleManualImport().processTLE methode benutzen . tust du aber nicht.

Meine Ausführungen beziehen sich auf das letzte repos. von Ludy.

Frage in der onCreate und in dem anschließenden Thread berechnest du auch einige Daten was Ist das? Speicherst die auch in den SharedFunctions Variablen. Sind das Daten des Aktuellen Satelliten?
Wo wann und wie werden die Daten eigentlich angezeigt?

Wenn das alles die Berechnung für einen Sat ist müsstest du das in der Forschleife machen und immer alles den Modle Variablen zuweisen. So würde es für jeden Sat auch berechnet.

Oder ist deine Sat Berechnung in der TleManualImport() Klasse? Wenn ja dann müsstest du in der Forschleife da für jeden Sat die Klasse aufrufen. Und das dem Array die werte in den Model Speichen.

Das setzt natürlich eine Singleton Klasse Voraus sonst kannst du in anderen Activitys nicht darauf zugreifen.

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

18.05.2020, 19:40:36 via Website

Hallo!
Ja das Ganze ist wirklich verwirrend. Weil einfach Code von mir übernommen wurde. Musste mich da mittlerweile wochenlang damit herumplagen bis ich es einigermaßen verstanden habe.
Ich habe das Projekt nochmal ganz neu angefangen.
Die Textdatei muss nur einmal heruntergeladen werden (und zwar wenn die App neu gestartet wird bzw. später, in dem das Datum verglichen wird).
Danach diese Datei zeilenweise auslesen (es sind dann 228 Zeilen). Es gehören immer drei Zeilen zu einem Satelliten wobei die erste dieser drei Zeilen den Namen des Satelliten beinhaltet den man dann schon verwenden kann. Bleibt ja immer gleich. Die anderen beiden Zeilen gehören dann "zerlegt" wie es Ludy ja mit den setter und getter-Methoden gemacht hat. Man erhält dann gewisse Variablen mit deren Werten man dann die Umlaufbahn etc. berechnen kann. Diese Berechnungen erfolgen dann in einer eigenen Klasse. Jetzt brauche ich einige der berechneten Werte um sie in einem ListView anzuzeigen (z.B. wann ist der nächste Überflug bezogen auf die aktuelle Position). Das ListView wiederum soll sich immer wieder aktualisieren um immer den Satelliten an erster Stelle anzuzeigen, der als nächstes den Überflug macht. Ich lade mal den neuen Code auf github, vielleicht ist es dann etwas aufschlussreicher. Wie schon einmal geschrieben, am besten wäre es, wenn sich jemand mal die App "heavens above" ansehen könnte und dort dann auf Funksatelliten drückt. Diese Funkion versuche ich nachzubauen.

— geändert am 18.05.2020, 19:41:51

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

18.05.2020, 20:04:08 via Website

ok lade den Code hoch wenn du willst wir schauen us das bestimmt an.
Die app habe ich geladen das sind da aber bestimmt mehr als 76 Sat.
228 Zeilen durch 3 = 76 gleich wie im alten code.

das was Ludy in der Model klasse macht ist nur ein auf spalten der Zeilen in Variablen . Keine Berechnung.

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

18.05.2020, 20:20:11 via Website

Hab es mal hochgeladen: https://github.com/patrickk83/Tracker.git
Die Klasse für die Berechnung hat noch Fehler da noch die "SharedFunctions" beinhaltet sind. Hab die Klasse gerade erst erstellt und den Code für das Berechnen eingefügt (CalculateData.class).

Ja und bei der App sind auch andere Satelliten neben den Funksatelliten enthalten. Die benötige ich aber nicht.

So, habs nochmal upgedatet.

— geändert am 18.05.2020, 20:29:46

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

18.05.2020, 21:09:23 via Website

Hallo habe es mir mal angesehen nur online nicht getestet.
Frage was soll das mit der teleData arraylist? In der Klasse teleData machst du eigentlich nicht speicherst nur die Daten aus den Model in die Liste berechnen tust du da nichts wozu?
Doppelte Zeit.

Ich sehe in deinem Code keine Berechnung.
Auch wird es schwierig auf die Liste in einer anderen activity zuzugreifen.
Genauso auf die Models Klasse die eigentlich genau das beinhaltet wie deine arrayListe.

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

18.05.2020, 21:13:40 via Website

Hab da nur ein wenig experimentiert mit der Arraylist und der TleData Klasse...

Für die gewünschten Berechnungen wäre die Klasse CalculateData gedacht.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

18.05.2020, 21:31:03 via Website

Ja habe ich schon gesehen. Nur wo benutzt du diese. Ist alles in kommentar.

Dein sortieren wird so wahrscheinlich auch nicht gehen.

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

18.05.2020, 21:37:23 via Website

Ach du meinst die Klasse für die Berechnungen. Die ist jetzt noch nicht eingebaut. Ich hab jetzt nur den Code in eine eigene Klasse kopiert um ihn dann später nutzen zu können. Nach dem Aufruf Models models = new ReadTxtFile(getBaseContext()).readFile();ist gedacht, die Berechnungen durchzuführen.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

19.05.2020, 11:17:38 via Website

Hallo habe es gerade mal getestet.
Wieder dein Hauptproblem . das Runterladen der Datei. Deine Models Kasse ist leer.
Du lädst zwar die Datei runter in dein internes User Verzeichnis.
Vergleiche mal die Pathe wo du die Datei hin lädst und von wo du lesen möchtest.

Schreiben tust du hier:
File output = new File(context.getFilesDir(), filename);

Lesen hier:
File textfile = new File(context.getExternalFilesDir(null), "amateur.txt");

Kann nie gehen.

Auch dein vermeintliche Warte Schleife ist falsch wird nicht gehen.
while (testMap == null) {
testMap = celestrakData.getSatData(getApplicationContext());
}
Das ist kein Warten. Wenn ein Objekt erstellt ist, ist die Dadei noch lange nicht da. Auch würdest du so wider den ui anhalten. Somit ist dann dein asynctask wider sinnlos.

Somit sind wir wieder beim anfangs Problem was @Ludy schon für dich gelöst hatte.

Sortieren könntest du so machen.
Collections.sort(tleDataArrayList, Comparator.comparing(TleData::getSatName));

Ich würde das aber gleich in der Models Klasse machen denn da hast du die gleiche liste musst also keine neue erstellen was nur zeit und speicher kostet.
Mache dafür doch eine Methote in der Klasse.

— geändert am 19.05.2020, 11:56:23

Hilfreich?
patrickk83
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

21.05.2020, 21:00:26 via Website

Hallo
Habe mal eine Veränderte Version hochgeladen.
Habe die Models Klasse als Singelton gemacht somit kannst du die Klasse und die enthaltene liste von jeder Activity benutzen.

Deine beiden Klassen zu Download brauchst du eigentlich nicht mehr.
Ich habe die beiden Klasse von ludy benutz etwas verändert.

https://github.com/JW-web/Tracker2.git

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

21.05.2020, 21:20:52 via Website

Besten Dank! Werde mir das morgen in der Früh ganz genau ansehen. Kann schon ganz schön verwirrend sein :-)

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

21.05.2020, 21:34:28 via Website

Was bedeutet diese Fehlermeldung? Unsupported Modules Detected: Compilation is not supported for following modules: Tracker2. Unfortunately you can't have non-Gradle Java modules and Android-Gradle modules in one project.

Hilfreich?
Kommentieren
patrickk83
  • Forum-Beiträge: 93

21.05.2020, 22:06:46 via Website

Wenn ich nach Collections.sort in der readDaten-Methode ein System.out.println("Test: "+tleDataArrayList.get(0)); einfüge, müsste ich dann nicht einen String ausgegeben bekommen? Im Logcat steht dann nur Test: com.example.tracker.TleData@ae13e5c

Mit get(0).getSatName() funktioniert es

— geändert am 21.05.2020, 22:13:10

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

21.05.2020, 22:28:16 via Website

Hallo ich benutze für das sortieren eine 
lambda expression. Dafür brauchst du Java 8 und in der gradle Datei must du die beiden Zeilen einfügen. Habe ich auch in dem Projekt gemacht. Das Studio macht das eigentlich auch für dich.

android { 
compileOptions { 
sourceCompatibility JavaVersion.VERSION_1_8 
targetCompatibility JavaVersion.VERSION_1_8 

}

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

21.05.2020, 22:35:39 via Website

System.out.println("Test: "+tleDataArrayList.get(0));

Geht in android nicht das ist java für eine console du bist auf einem framework mit einer grafischen Oberfläche keine console.

Man benutzt in Android Log und nicht println.

Hilfreich?
patrickk83
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

22.05.2020, 08:34:20 via Website

a Kann schon ganz schön verwirrend sein 

Der Grund dafür wird wohl sein das du einfach Code kopierst aber noch nicht richtig verstanden hast.
Sieht man auch an dem Fehler mit den Datei Pfaden.

Wenn ich nach Collections.sort in der readDaten-Methode ein System.out.println("Test: "+tleDataArrayList.get(0)); einfüge, müsste ich dann nicht einen String ausgegeben bekommen? I

Nein dann schaue dir an was du für Objekte in deiner Liste hast.

ArrayList<TleData> tleDataArrayList = new ArrayList<>();

TleData ist eine Klasse von dir die eine viele Strings hat. Du bekommst somit die Instanz auf den einen Listeneintrag.

Übrigens verstehe ich nicht warum du das überhaupt brauchst das hast alles in deiner Models Klasse. Ich habe das zwar drin gelassen da mit du zurecht kommst aber brauchen tust du es nicht.
Auch wieder ein Beispiel das du nicht schaust und versuchst zu verstehen was wir dir ändern.

Methode ReadDaten habe ich erstellt weil du da vielleicht deine Berechnungen machen kannst.

— geändert am 22.05.2020, 19:08:51

Hilfreich?
patrickk83
Kommentieren
patrickk83
  • Forum-Beiträge: 93

01.06.2020, 14:35:08 via Website

Hallo Leute, ich mal wieder.

Könnte sich jemand bitte kurz die MainActivity hier ansehen? https://github.com/patrickk83/P4J_Test.git

Würde gerne das textAzi sowie die beiden textLat und textLon im Sekundentakt aktualisieren. Das will aber nicht funktionieren. Wenn ich testweise im runOnUiThread die Variable count in einem Textfeld ausgebe (textAzi.setText("Azimuth: " + count)), so zählt mir das Programm allerdings brav von 0 bis.
Wenn ich das App hintereinander neu starte so werden die Werte auch aktualisiert.

Wäre hier eine Lösung mit AsyncTask eventuell ratsam?

Vielen lieben Dank im Voraus

— geändert am 01.06.2020, 15:34:26

Hilfreich?
Kommentieren