lastModified() einer Application bekommen

  • Antworten:55
  • Bentwortet
Alexander R.
  • Forum-Beiträge: 1.148

01.08.2011, 23:41:42 via Website

Hallo,
ich habe einen ApplicationListAdapter, der mir von den installierten Anwendungen bestimmte Sachen übergibt. (InstallSize, InstallDir...)
Nun ist meine Frage, wie kann ich rausfinden, wann eine App installiert wurde?
Das müsste ja mit File.lastModified() gehen.

Weiss jemand wie ich das gut umsetzen könnte?
Ich habe es nun folgendermassen aufgebaut, nur bekomme ich bei jeder App den Wert "0" zurück (KEIN DATUM):

1package de.rocky.info;
2
3import java.io.File;
4
5public class App {
6
7 private String title;
8 private String packageName;
9 private String versionName;
10 private int versionCode;
11 private String description;
12 private String installDir;
13 private String installSize;
14 private String installDate;
15
16 // ordinary getters and setters
17
18 public String getTitle() {
19 return title;
20 }
21
22 public void setTitle(String title) {
23 this.title = title;
24 }
25
26 public String getPackageName() {
27 return packageName;
28 }
29
30 public void setPackageName(String packageName) {
31 this.packageName = packageName;
32 }
33
34 public String getVersionName() {
35 return versionName;
36 }
37
38 public void setVersionName(String versionName) {
39 this.versionName = versionName;
40 }
41
42 public int getVersionCode() {
43 return versionCode;
44 }
45
46 public void setVersionCode(int versionCode) {
47 this.versionCode = versionCode;
48 }
49
50 public String getDescription() {
51 return description;
52 }
53
54 public void setDescription(String description) {
55 this.description = description;
56 }
57
58 public String getInstallDir() {
59 return installDir;
60 }
61
62 public void setInstallDir(String installDir) {
63 this.installDir = installDir;
64 }
65
66 public String getInstallSize() {
67 return installSize;
68 }
69
70 public void setInstallSize(String installSize) {
71 this.installSize = installSize;
72 }
73
74 public String getDate() {
75 File f = new File(this.getInstallDir() + this.getPackageName());
76 long date1 = f.lastModified();
77 installDate = Long.toString(date1);
78 return installDate;
79 }
80
81 public void setDate(String installDate) {
82 this.installDate = installDate;
83 }
84}

Gruß Alexander

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.08.2011, 09:20:40 via Website

Versuchs mal so:

1PackageManager packageManager = getPackageManager();
2ApplicationInfo applicationInfo = packageManager.getApplicationInfo("your.package.name", 0);
3String sourceDir = applicationInfo.sourceDir;
4long lastModified = new File(sourceDir).lastModified();

Gruß
Harald

— geändert am 02.08.2011, 09:21:17

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

02.08.2011, 09:35:39 via Website

sei mir nicht böse, aber du öffnest extrem viele threads in zwei foren für eigentlich dinge, die man selbst durch ein paar minuten googlen leicht finden kann.

vielleicht machst einen thread für dich und deine problemchen und erweiterst den einfach laufend - das würde ja eventuell auch reichen, oder?

swordiApps Blog - Website

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

02.08.2011, 12:04:08 via App

@Harald
Ich muss noch das Installarionsverzeichnis und den Packagenamen bekommen (da das lastModified() bei jeder App in einer ListView über einen holder angezeigt werden soll) drum...Oder geht das mit deinem FundCode genau so? Ich frage, weil man da einen PackageNamen eingeben muss...

@Markus
Dafür ist das Forum doch da...
Wenn andere solche Fragen auch mal haben finden Sie es schneller...
Oder ich mache wie du sagst einen Thread und wenn ich eine Lösung habe schreibe ich diese in die Code Snippets Abteilung... wäre eventuell besser

— geändert am 02.08.2011, 12:07:59

Gruß Alexander

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

02.08.2011, 15:29:39 via Website

ist schon klar, aber die antworten auf deine fragen wüsste google sicher auch recht schnell - zumindest einen großteil.

wenn jeder für jede frage einen thread aufmacht, dann wär das inet bald noch unübersichtlicher ;D

swordiApps Blog - Website

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

02.08.2011, 16:06:46 via Website

Hallo Admin Service Limited,
habe es nun so gemacht wie du es beschrieben hast:

1public String getDate() {
2 PackageManager packageManager = getPackageManager();
3 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(Context.getPackageName(), 0);
4 String sourceDir = applicationInfo.sourceDir;
5 long lastModified = new File(sourceDir).lastModified();
6 installDate = Long.toString(lastModified);
7 return installDate;
8 }

Nun gibt es hier in Zeile 2 folgenden Fehler:
1The method getPackageManager() is undefind for the type App

Und In Zeile 3 folgenden:
1Cannot make a static reference to the non-static method getPackageName() from the type Context

(Nur am Rande "App" ist nur eine Klasse die Sachen zurückgibt)

Gruß Alexander

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

02.08.2011, 16:27:21 via Website

Die Fehlermeldungen sagen doch schon alles.

- natürlich existiert die Methode getPackageManager() nicht in der App Klasse, weil es eine Methode von Context (bzw. Activity) ist.
- getPackageName() kannst Du natürlich auch nur auf einer Instanz aufrufen und nicht static auf der Klasse Context.

Du musst den Context durchreichen, denn der Beispielcode ist für die Benutzung direkt in der Activity gedacht.

— geändert am 02.08.2011, 16:28:11

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.08.2011, 16:45:07 via Website

Ich habe Context groß geschrieben damit Du erkennst das es eine Klasse ist. Natürlich brauchst Du einen Instanz von Context - und die bekommst Du mit:

1Context context = getApplicationContext()

oder Du reichst den context durch Dein System durch. Es gibt aber von einigen Android Entwicklern bei Google Texte die das Durchreichen von Context eher nicht empfehlen. Am Context hängt halt alles und es kann so zu einem erhöhtem Speicherverbrauch kommen. Es wird statt dessen empfohlen den ApplicationContext jedesmal abzufragen.

Gruß
Harald

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

02.08.2011, 17:13:24 via Website

Hallo Harald,
habe es nun wie folgt geändert und es gibt keinen Fehler mehr:

1public String getDate() {
2 Context context;
3 context.getApplicationContext();
4 PackageManager packageManager = getPackageManager();
5 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long lastModified = new File(sourceDir).lastModified();
8 installDate = Long.toString(lastModified);
9 return installDate;
10 }

Nun gibt es hier in Zeile 4 noch den Fehler:
1Unhandled exception type PackageManager.NameNotFoundException

Diesen habe ich dann mit folgendem behoben:
In der App.java

1public String getDate() throws NameNotFoundException {
2 context.getApplicationContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
5 String sourceDir = applicationInfo.sourceDir;
6 long lastModified = new File(sourceDir).lastModified();
7 installDate = Long.toString(lastModified);
8 return installDate;
9 }

Und der AppListAdapter.java
1try {
2 holder.setDate(app.getDate());
3 } catch (NameNotFoundException e) {
4 // TODO Auto-generated catch block
5 e.printStackTrace();
6 }

Nun gibt es dort dann den Fehler:
108-02 17:09:55.460: ERROR/AndroidRuntime(9684): java.lang.NullPointerException
208-02 17:09:55.460: ERROR/AndroidRuntime(9684): at de.rocky.info.App.getDate(App.java:81)

In dieser Zeile steht im Code
1Context context;
2context.getApplicationContext();
hast du dazu eine Idee

— geändert am 02.08.2011, 17:15:19

Gruß Alexander

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.08.2011, 20:55:28 via Website

Hast Du überhaupt rudimentäre Programmierkenntnissse? Wenn Dein Alter stimmt dann bist 17 - ok, ich sehe einiges nach. Aber Du solltest langsam beginnen Dinge zu lernen und nicht erwarten das alles mundgerecht serviert wird. Also bis 18 helfe ich - dann fliegst Du aus dem Nest ;-)

Was soll denn das machen?

1Context context;
2context.getApplicationContext();

Du brauchst wohl eher das?

1public String getDate() {
2// Context context = getApplicationContext();
3 PackageManager packageManager = getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
5 String sourceDir = applicationInfo.sourceDir;
6 long lastModified = new File(sourceDir).lastModified();
7 installDate = Long.toString(lastModified);
8 return installDate;
9}

oder je nachdem in welchem Kontext Du Dich bewegst:

1public String getDate() {
2Context context = getApplicationContext();
3PackageManager packageManager = context.getPackageManager();
4ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
5String sourceDir = applicationInfo.sourceDir;
6long lastModified = new File(sourceDir).lastModified();
7installDate = Long.toString(lastModified);
8return installDate;
9}

oder so ähnlich ...

— geändert am 02.08.2011, 20:55:53

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

02.08.2011, 21:03:25 via Website

Alexander R.

Nun gibt es dort dann den Fehler:
108-02 17:09:55.460: ERROR/AndroidRuntime(9684): java.lang.NullPointerException
208-02 17:09:55.460: ERROR/AndroidRuntime(9684): at de.rocky.info.App.getDate(App.java:81)

In dieser Zeile steht im Code
1Context context;
2context.getApplicationContext();
hast du dazu eine Idee

Bitte bitte bitte lies ein Java Grundlagenbuch ! :)
BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE BITTE !!!!!!!!!!!!!!!!!!!11111einself

Damit der Post hier auch noch eine Antwort enthält:
- Was enthält "context" nach der ersten Zeile?
- Was passiert wenn du auf diesem speziellen Wert eine Methode aufrufst?




EDIT:
Mist zu spät...er sollte doch von selbst drauf kommen ;)

— geändert am 02.08.2011, 21:04:29

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

02.08.2011, 21:26:12 via Website

Hallo Harald,
genau deinen zweiten Vorschlag habe ich auch schon gehabt, habe ich selbst rausbekommen, jedoch gab es da folgenden Fehler:
1the method getApplicationContext() is undefined for the type App

— geändert am 02.08.2011, 21:26:37

Gruß Alexander

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

02.08.2011, 21:34:54 via App

nimm dir bitte die Posts zu Herzen und lernen Java Grundlagen. das erspart dir viel.

solange hier Losungen dauernd vorgekaut werden ist es sicher bequem.

swordiApps Blog - Website

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

02.08.2011, 21:52:50 via Website

Ich habe nun folgendes gemacht:
In der MainActicty folgendes hinzugefügt:
1static Context context;

In der onCreate()
1Context context = getApplicationContext();

Außerhalb der onCreate()
1public static Context getAppContext() {
2 return context;
3 }

Und in meinem Aufruf in App
1public String getDate() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 context.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long lastModified = new File(sourceDir).lastModified();
8 installDate = Long.toString(lastModified);
9 return installDate;
10 }

Nun bekomme ich immer folgende Zahlen zurück:
1312314758000

Warum wird mir hier nun kein Datum zurück gegeben

— geändert am 02.08.2011, 21:54:06

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 01:41:43 via Website

Abgesehen davon, das die Zahl durchaus ein Datum darstellt (2.8.2011, 21:52) findest du das ganz leicht heraus, indem du den Code mal liest, den du hier von den anderen vorgekaut bekommst:

long lastModified
ist ein Datum, wie du es dir vorstellst?
Nicht? Was sagt dann die Doku zu .lastModified()?

Am Rande: du bekommst bei allen Apps die gleiche Zahl? Das kommt dir nicht merkwürdig vor?
Das kommt wenn man das "Learning" (aus einem deiner letzten Threads) außen vor lässt.

Wie die anderen hier schon sagten: lerne die Grundlagen und vor allem lerne, die Ursache für auftretende Probleme selber zu ermitteln, indem du den kopierten Code auch mal liest/analysierst, ihn zu verstehen versuchst.

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 07:21:46 via App

Ich weiss nun, dass das lastModified() die das Datum sowie die Zeit in Millisekunden zurück liefert.

Also muss ich noch folgendes hinzufügen dass ich das Datum bekomme:
1public String getDate() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 context.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long lastModified = new File(sourceDir).lastModified();
8 Date installDate = new Date(lastModified);
9 return installDate;
10 }

Und dass immer die gleiche Zahl kommt, muss noch an meiner Definition von Context liegen...
Stimmt das soweit?

Habe hier im Übrigen das Buch "Einstieg in Java 6", von Bernhard Steppan, dort konnte ich leider nichts zum Context oder er getApplicationContext() finden....
Eventuell falsches/nicht richtiges Buch?

— geändert am 03.08.2011, 07:29:49

Gruß Alexander

Antworten
Ratz F.
  • Forum-Beiträge: 61

03.08.2011, 08:21:45 via App

kann mich den Vorschreibern nur anachliessen, java-grundlagen lernen und ab und zu auch mal eine Suchmaschine deiner Wahl benutzen, dann hättest du schnell herausbekommen dass getApplicationContext eine Funktion des Android-SDK ist und nicht des Standard Java.

Antworten
Thomas L.
  • Forum-Beiträge: 58

03.08.2011, 08:40:44 via Website

also erstmal auch von mir noch ein hinweis:
es ist zwar sehr löblich, dass du immer kommentierst was du jetzt geändert hast dass es dann funktioniert. Falls wirklich mal einer diese langen Threads mit vorgegebenem Code lesen sollte, dann hat er so sicherlich die Möglichkeit besser nachzuvollziehen, ABER:

1. Java ist nicht das selbe wie Android
Java ist die Platformunabhängige Programmiersprache, in der auch für das Betriebssystem Android programmiert wird.
Darum brauchst du ja zum programmieren auch das Android SDK und das Java SDK.
Ohne Javakenntnisse wirst du wirklich nicht weit kommen. Und auch wenn du die learning by doing Methode bevorzugst (wie es mal aus einem anderen Thread hervorging), was du machst kann nicht zum Ziel führen. Wie "and dev" schon sagte: du kannst nicht immer nur Copy/Paste machen. Das ist kein lernen. Irgendwann hat keiner mehr Lust deine Programme zu schreiben.
Also lerne doch erst einmal Java.
Einstieg in Java6 ist durchaus ein vernünftiges Buch, ansonsten ist (wie überall empfohlen) "Java ist auch eine Insel" ein guter Einstieg oder auch ein Nachschlagewerk.

2. Wenn du Java (grundlegend) kannst, mach dich dann an Android
Das Android SDK bietet gegenüber dem Java SDK nochmal einige Eigenheiten. Sowohl Activities, und Context gehören dazu. Mit denen wirst du in Java noch nicht in Berührung kommen. Also erst Java, dann Android. Um mit diesen Eigenheiten vertraut zu werden, gibt es dann Android Bücher (ebenfalls für die Grundlagen)

3. Wie Markus schon gesagt hat: deine Threads sind verdammt lang
Und das aus den oben genannten Gründen. Wenn du die Grundlagen beherrschst, werden deine Threads wesentlich präziser, und kürzer. Wenn du großen schreib-Bedarf hast, öffne einen Blog über deine Android-Aktivitäten. Da wirst du sicher auch einige Leser finden, aber hier im Forum ist dieser Umfang wohl eher nicht angebracht.

4. Nicht den Mut verlieren :wink:
Auch wenn du jetzt Android erstmal ruhen lassen solltest und back-2-the-roots unterwegs bist: Hab Android immer als Motivation im Hinterkopf. Klar ist es lästig jetzt aufzuhören, und von null anzufangen, aber es lohnt sich. Für konkrete Fragen gibts ein super Java-Forum (auch für Anfänger).
Wenn du dann denkst soweit zu sein für Android, dann gibts ja dieses Forum hier :wink:

last but not least
Aus deiner Frage erschließt sich, dass du das JavaBuch als Nachschlagewerk nimmst (weil du nix über Context gefunden hast).
Ich gehe jedenfalls davon aus, dass du nicht das ganze Buch in 6Std durch hattest.
Tu dir selbst einen Gefallen: lese sie von A bis Z und vollziehe die Schritte nach und mache die Beispiele selbst am PC. Ändere den Code etwas ab und spiele damit herum. Dann verstehst du bald auch was sich dahinter verbirgt.

Ich hoffe du verstehst den langen Post hier nicht falsch.
Es ist nur ein gut gemeinter Rat (wie auch von den anderen hier schon angesprochen)

mfg

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

03.08.2011, 08:55:29 via Website

er ignoriert solche ratschläge sowieso

und so lange es immer einen gibt, der lösungen für ihn hier 1:1 reinpostet, muss er sich ja nicht die mühe machen und das genau verstehen.

swordiApps Blog - Website

San Blarnoi

Antworten
Thomas L.
  • Forum-Beiträge: 58

03.08.2011, 09:06:19 via Website

Man wird sehen. :wink:
Immerhin war seine letzte Frage doch nicht mehr nach Code, sondern eher ob er das richtige Buch hat.
Find ich gut :)

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

03.08.2011, 09:21:29 via Website

hehe ja :)

swordiApps Blog - Website

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

03.08.2011, 09:24:42 via Website

Alexander R.
Habe hier im Übrigen das Buch "Einstieg in Java 6", von Bernhard Steppan, dort konnte ich leider nichts zum Context oder er getApplicationContext() finden....
Eventuell falsches/nicht richtiges Buch?

Doch das Buch ist sicherlich super um die Grundkonzepte von Java zu lernen und genau das solltest du tun.
DANACH arbeite an deinem Android Projekt weiter :)

Dann wirst Du evtl. auch den Unterschied zwischen einer Sprache und einem API verstehen und warum in diesem konkreten Buch nichts zu getApplicationContext() steht, aber die Lektüre trotzdem sinnvoll war.
Ansonsten programmieren wir hier häppchenweise deine App für dich ... das kanns ja nicht sein.

Markus Gu

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

03.08.2011, 09:27:13 via Website

Rafael K.
Alexander R.
Habe hier im Übrigen das Buch "Einstieg in Java 6", von Bernhard Steppan, dort konnte ich leider nichts zum Context oder er getApplicationContext() finden....
Eventuell falsches/nicht richtiges Buch?
das kanns ja nicht sein.

ich würd mal sagen, eine umsatzbeteiligung wär das mindeste :D

swordiApps Blog - Website

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 12:08:50 via Website

Ich weiss nun, dass das lastModified() die das Datum sowie die Zeit in Millisekunden zurück liefert.

...und war das jetzt wirklich aufwendiger, als einen Beitrag zu schreiben, in dem du danach fragst?


public String getDate()
...
Date installDate = new Date(lastModified);
return installDate;

Sollte sich das übersetzen lassen, dann bekommst du irgendeine Darstellung - das ist, was du willst?

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 12:16:08 via Website

Das war mein Ansatz und nun hab ichs richtig hinbekommen...
Nun fehlt mir nur noch das mit dem Context richtig zu machen
1public String getDate() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 context.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long lastModified = new File(sourceDir).lastModified();
8 Date date = new Date(lastModified);
9 SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
10 installDate = formatter.format(date);
11 return installDate;
12 }

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 19:21:42 via Website

Nun fehlt mir nur noch das mit dem Context richtig zu machen

Das ergab deine Fehleranalyse?
Wie erklärst du dann, das du de facto aus dem "falschen" Context einen funktionierenden packageManager bekommst, da dessen getApplicationInfo() ja plausible Daten liefert?

Hast du noch eine andere Theorie? :)


An die anderen: jetzt vielleicht mal nicht vorsagen, sonst wird das nie was mit dem Lerneffekt ;)

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 19:35:21 via App

Ich definieren die ApplicationInfo aus context und dieser ist ja von meiner MainActivity... Also gibt der bei allen das lastModified meiner eigenen App aus...
Also muss ich das mit meiner eigenen App Klasse machen oder?

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 19:45:08 via Website

Also muss ich das mit meiner eigenen App Klasse machen oder?

Was ist denn "das"?


bei allen das lastModified meiner eigenen App aus

Das ist korrekt :)

Woran liegt das?
Genau: dein applicationInfo hat falsche Daten; warum?
Hinweis: dein applicationInfo kommt aus .getApplicationInfo() - woher weiss die Methode, zu welcher Application sie Infos liefern soll?

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 19:48:11 via Website

Ich habe meine eigene Klasse App die mir z.B den PackageNamen von meinen Installierten Apps zurückgibt...

Also muss ich nur folgendes machen:
1public String getDate() throws NameNotFoundException {
2Context context = MainActivity.getAppContext();
3PackageManager packageManager = context.getPackageManager();
4ApplicationInfo applicationInfo = packageManager.getApplicationInfo(this.getPackageName(), 0);
5String sourceDir = applicationInfo.sourceDir;
6long lastModified = new File(sourceDir).lastModified();
7Date date = new Date(lastModified);
8SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
9installDate = formatter.format(date);
10return installDate;
11}

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 19:57:08 via Website

Siessu, und erhältst du jetzt die gewünschten Ausgaben in deiner Liste?

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 20:12:46 via App

Jap alles funktioniert nun wunderbar

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.08.2011, 20:48:17 via Website

OK, dann können wir ja zum nächsten Kapitel kommen :)

Warum ist diese Lösung total ineffizient und wie könntest du das gewünschte Ergebnis viel einfacher erhalten?

Markus Gu

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

03.08.2011, 20:58:17 via Website

Was mienst du mit uneffizient?
Mir würde so direkt jetzt nichts einfallen mal schauen...
Was hättest du für eine Idee

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

04.08.2011, 00:11:21 via Website

Was mienst du mit uneffizient?

Da Android resourcenschonend konzipiert ist, beinhaltet ein ListView nur wenig mehr Views als gerade sichtbar sind - in deinem Adapter ist dir vielleicht der convertView aufgefallen - d.h. das deine Methoden quasi jedes mal aufgerufen werden, wenn beim scrollen ein neues Element sichtbar wird;
unter diesen Methoden ist auch die gerade fertiggestellte, die eine Menge Aufrufe tätigt, Objekte erzeugt etc. - und das eben immer und immer wieder und nur zu dem Zweck, im gegebenen Zeitrahmen eine Konstante (das Datum) zu liefern.

Was machen wir also?

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

04.08.2011, 00:50:50 via App

Eventuell im Hintergrund weiter laden lassen oder die Methode verkleinern.

Ich habe es gerade mal probiert, ohne etwas nachzuladen oder so läuft die ListView sauber und schnell...

(Das Datum etc wird in der OnCreate bereits über einen Befehl (getInstalledApps(INCLUDE_SYS)) aufgerufen)

Siehe Thread hier zu meiner gebauten Methode:
https://www.nextpit.de/de/android/forum/thread/431113/Anwendungen-auflisten-OHNE-Systemapps-Problem

— geändert am 04.08.2011, 00:51:46

Gruß Alexander

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

04.08.2011, 01:18:45 via Website

Eventuell im Hintergrund weiter laden lassen oder die Methode verkleinern.

...oder die Information einmalig beim Erstellen der Liste ermitteln?
Dort hast du nämlich den Pfad (sourceDir) eh schon am Wickel, kannst damit das Datum einmalig bestimmen und in einem neuen Member speichern, den du dann beim getDate() einfach abliefern kannst.

Ich meine sogar mal gesehen zu haben, das man aus einer der Strukturen das Datum der Installation und des letzten Updates direkt bekommen kann.

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 22:46:54 via Website

Hallo,
ich möchte nun von einer App X die Größe in Bytes bekommen.
Diese möchte ich später zum Sortieren vergleichen....
Bisher bin ich soweit, dass ich es als Bytes auslesen kann, nun frage ich mich, wie ich das zurückgeben kann und es dann auch mit dem sortieren klappt.
Jemand eine Idee? Irgendwie muss ich es ja erstmal als String verständlich machen.
Oder kann man auch direkt die bytes zurückgeben und vergleichen

1public String getBytes() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long bytes= sourceDir.length();
8 return installSize;
9 }

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 23:02:42 via App

Also, wie dir schon von Vielen gesagt wurde: die Grundzüge von Java sollte man schon verstanden haben..
Ich nehme mal an 'installSize' ist eine Instanzvariable deiner 'App'-Klasse. Dann ist es nämlich so, das du dir die ganzen Zeilen in der Methode auch sparen kannst, weil sie keine Auswirkung auf das Ergebnis haben..
Ich kann verstehen, dass es mehr Spaß macht, wenn man Java durchs Programmieren selbst lernt, aber bitte, bitte tue mir und den anderen Hilfsbereiten hier im Forum den Gefallen und lern erst Java. Auch wenn es nur eine Winzigkeit ist. Du wirst einen riesigen "Aha-Effekt" haben. Wenn deine Englischkenntnisse ok sind, kann ich dir die Video Tutorials von "thenewboston" auf YouTube empfehlen (Das ist ein junger Mann, der wirklich leicht und kurzweilig mit lustigen Beispielen erklärt).
Lg Ansgar
P.S. Zu deinem Code: Dass deine Variable namens bytes warscheinlich die Anzahl der Buchstaben des Pfades zur Apk enthält ist dir schon klar?

— geändert am 09.08.2011, 23:05:52

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 23:25:29 via Website

Hallo Ansgar,
das war ein kleiner Fehler den ich schon behoben hatte, leider erst nach dem posten:
1public String getBytes() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long bytes = new File(sourceDir).length();
8 return installSize;
9 }

Nun habe ich es folgendermassen:

1public String getBytes() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long bytes = new File(sourceDir).length();
8 byteSize = (new Long(bytes)).toString();
9 return byteSize;
10 }

Leider mischt der mir KB und MB immernoch

— geändert am 09.08.2011, 23:30:18

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 23:35:06 via App

Also long zu String konvertieren geht mit einer statischen Methode von String (Google "Java Typen Umwandlung"). Nur in diesem Zusammenhang ist das überhaupt nicht effizient (Der arme Androide muss alles erst zum Text machen, um dann die Zahlen als Text alphabetisch zu ordnen. Das macht doch irgendwie keinen Sinn, oder?). Wenn der Rückgabewert hingegen einfach die long Variable, also die Dateigröße, ist. Kannst du im Comparator einfach die beiden Zahlen vergleichen. Hast du mal gelesen, was die compare-Methode im Comparator zurückgeben soll?
Lg Ansgar

— geändert am 09.08.2011, 23:35:21

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

09.08.2011, 23:50:05 via Website

Ja das ganze hin und her konvertieren ist schwachsinn....

Er soll die beiden vergleichen und dann die größere nach oben in meine ListView setzen...
Also Sehr große MB Dateien nach oben und kleine KB Dateien nach unten...
Hättest du da einen schnipsel für mich der das macht??

Habe nun folgenden Ansatz:

App.java
1public long getBytes() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long byteSize = new File(sourceDir).length();
8 return byteSize;
9 }


AppBySizeComparator.java
1import java.util.Comparator;
2import android.content.pm.PackageManager.NameNotFoundException;
3
4public class AppBySizeComparator implements Comparator<App>
5{
6 int size;
7 public int compare(App o1, App o2) {
8 try {
9 size = o1.getBytes().compareTo(o2.getBytes());
10 } catch (NameNotFoundException e) {
11 // TODO Auto-generated catch block
12 e.printStackTrace();
13 }
14 return size;
15 }
16}

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 23:56:12 via App

Alexander R.
Hättest du da einen schnipsel für mich der das macht??
Ja, nur dann fragst du danach gleich nach dem nächsten Snippet und lernst nichts daraus. :(
Hast du mal gelesen, was ein Comparator bei der Methode compare zurückgeben soll? (Einen Integer ist schonmal klar, aber welchen Wert, wenn größer, und welchen, wenn kleiner, bzw. gleich?)
Lg Ansgar

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

10.08.2011, 00:38:32 via App

Ich schaue mir die Snippets ja an und versuche zu verstehen, was die im einzelnen machen...

negativer Rückgabewert: Der erste Parameter ist untergeordnet

0 als Rückgabewert: Beide Parameter werden gleich eingeordnet

positiver Rückgabewert: Der erste Parameter ist übergeordnet

Gruß Alexander

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.08.2011, 20:34:33 via Website

wie müsste es dann weitergehen?

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.08.2011, 21:41:21 via App

Du schreibst einen Comparator der je nach Datum verschiedene Integer Werte zurück gibt :P
Lg Ansgar
P.S. Tipp: Lass dir das Datum in Millisekunden umwandeln. Oder noch besser, benutz die Funktion vom Calendar, zu sagen, ob das Datum vor oder hinter einem anderen liegt.

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.08.2011, 22:37:16 via App

Datum hab ich schon hinbekommen...
Es geht nur noch um die Size...
Das der da mit Bytes arbeitet

Alexander R.
Ja das ganze hin und her konvertieren ist schwachsinn....

Er soll die beiden vergleichen und dann die größere nach oben in meine ListView setzen...
Also Sehr große MB Dateien nach oben und kleine KB Dateien nach unten...
Hättest du da einen schnipsel für mich der das macht??

Habe nun folgenden Ansatz:

App.java
1public long getBytes() throws NameNotFoundException {
2 Context context = MainActivity.getAppContext();
3 PackageManager packageManager = context.getPackageManager();
4 ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
5 this.getPackageName(), 0);
6 String sourceDir = applicationInfo.sourceDir;
7 long byteSize = new File(sourceDir).length();
8 return byteSize;
9 }


AppBySizeComparator.java
1import java.util.Comparator;
2import android.content.pm.PackageManager.NameNotFoundException;
3
4public class AppBySizeComparator implements Comparator<App>
5{
6 int size;
7 public int compare(App o1, App o2) {
8 try {
9 size = o1.getBytes().compareTo(o2.getBytes());
10 } catch (NameNotFoundException e) {
11 // TODO Auto-generated catch block
12 e.printStackTrace();
13 }
14 return size;
15 }
16}

Da bekomm ichs nicht hin die beiden "long" zu vergleichen

— geändert am 12.08.2011, 22:38:47

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.08.2011, 23:09:13 via App

Hm,
wie könnte man beispielsweise zwei Zahlen vergleichen?
Es ist leichter, als du denkst..
Lg Ansgar
edit: Tipp: 1-(a/b)

— geändert am 12.08.2011, 23:11:48

Antworten
Alexander R.
  • Forum-Beiträge: 1.148

12.08.2011, 23:24:05 via App

Mit =, <= ,>= ...
Stimmt der Code um die werte richtig in Bytes zu bekommen?

Gruß Alexander

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.08.2011, 23:38:05 via App

Welcher Code? Das was bei meinem Edit steht müsste funktionieren.
Lg Ansgar

Antworten