Android Dev Neuling - Fragen über Fragen :-)

  • Antworten:26
Kay J.
  • Forum-Beiträge: 59

06.05.2010, 21:07:31 via Website

Hallo AndroidPit Community!

Ich bin seit Montag stolzer Besitzer eines Motorola Milestone... ursprünglich hatte ich zwar überlegt mir ein iPhone zuzulegen, aber da von anfangan mein Ziel war für mein Handy Apps zu Programmieren was beim iPhone zusätzlich zu den 700€ (ohne Vertrag, da ich schon einen habe :P) für das Gerät noch extra Kosten für ein Mac/MacBook bedeuten würde => NO GO! :D


Okay, soviel zur Vorgeschichte... auf zu meinen (bisher ungeklärten) Fragen :D

Die größte Frage, bei der mir auch google bisher nicht helfen konnte, ist bezüglich der Drawables/Layouts. Da meine erste App über kurz oder lang - wenn sie halt soweit ist - für eine große Online Comunity verfügbar sein wird, und ein schickes Design haben soll.... Als der Grafiker meines vertrauen dann zu mir meinte "Welche Auflösung soll ich den machen?" stand ich erstmal vor einem Rätsel! Auf http://developer.android.com/guide/practices/screens_support.html stehen 8 Auflösungen bei unterschiedlichen DPI aber das will ich weder meinem Grafiker, noch mir zumuten. Deswegen würde ich gerne wissen welche 1-2 (oder auch 3?) Auflösung/Dpi Pärchen am sinnvollsten sind um auf möglichst vielen Geräten möglichst gut auszusehen, und auf den größeren Displays ggf bisschen mehr anzuzeigen :)



Jetzt noch ein paar kleinere Fragen, bei denen ich auch noch nicht oder nur bisschen gegoogeld habe, da ich mir derzeit mehr gedanken über das design mache :D

1) Wie kann man ein rechts/links Slide für ein bestimmten Bereich machen, so wie bei Android-IRC zum Channel wechsel. (aber bei mir vermutlich mit grafiken^^)
2) (eher Java allgemein) Ich habe bereits einen weg gefunden einen String mit JSON daten in ein JSON objekt zu laden (link) allerdings habe ich noch nichts gefunden wie ich entsprchende daten von einer website lade und entsprechend in einen string bekomme. alles was ich gefunden habe, war wie man eine datei runterlädt und speichert, was aber ein unnötiger aufwand ist, die daten erst zu speichern dann einzulesen und die datei weider zu entfernen ^^


So, das wars erstmal, für die letzten beiden Fragen reichen denke ich Anhaltspunkte, aber zu detalierteren vorgehens weisen oder gar beispielcode von jemandem der sowas schon umgesetzt hat. sage ich natürlich auch nicht nein :D

Ich danke schonmal im vorraus! :)


Mit freundlichen Grüßen
Kay :-)

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

06.05.2010, 22:02:02 via App

Zu Deiner ersten Frage - ich würd sagen:

320x480 bei 160 dpi
480x800 bei 240 dpi
480x854 bei 240 dpi

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

06.05.2010, 22:10:40 via App

zu 2)
Mit welcher Technologie entwickelst du denn die Webseite, die den JSON-String generieren soll?

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

06.05.2010, 22:14:59 via Website

Dank für die schnelle Antwort! :D

Sven Woltmann
Zu Deiner ersten Frage - ich würd sagen:

320x480 bei 160 dpi
480x800 bei 240 dpi
480x854 bei 240 dpi
Danke, werds mal an meinen Grafiker weiterleiten :)

Sven Woltmann
zu 2)
Mit welcher Technologie entwickelst du denn die Webseite, die den JSON-String generieren soll?
Mit PHP. :)

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

06.05.2010, 22:28:01 via App

Oh... da bin ich der falsche Ansprechpartner :-) Da würde ich einfach mal nach "php json generator" googlen. Oder den JSON-String manuell zusammenbauen. Ist ja ganz einfach aufgebaut.

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

06.05.2010, 22:51:13 via Website

Sven Woltmann
Oh... da bin ich der falsche Ansprechpartner :-) Da würde ich einfach mal nach "php json generator" googlen. Oder den JSON-String manuell zusammenbauen. Ist ja ganz einfach aufgebaut.

Oh, ich glaub du hast die frage falsch verstanden :D
den String zu generieren ist kein problem für mich, PHP ist quasi meine muttersprache in sachen programmieren :P es geht darum die entsprechende datei mit java(neuland für mich^^) zu downloaden und dann in ein java json object zu packen, ohne die datei erst auf dem gerät speichern zu müssen - was das einzige ist was ich bisher gefunden habe zu downloaden ^^

also quasi sowas wie:
1httpclient cli = new httpclient("http://my.host.com/daten.json");
2String jsonstring = cli.getAsString();
3JSONObject jObject; = new JSONObject(jString);


Danke für die hilfe soweit =)

Antworten
ZoMtEc
  • Forum-Beiträge: 80

06.05.2010, 23:00:51 via Website

Sven Woltmann
Oh... da bin ich der falsche Ansprechpartner :-) Da würde ich einfach mal nach "php json generator" googlen. Oder den JSON-String manuell zusammenbauen. Ist ja ganz einfach aufgebaut.

Sven, manchmal ist php echt praktisch - musste vor kurzem auch mal wieder php "berühren" und folgende 3 zeilen haben mich dabei extrem beeindruckt ^^

1$content = file_get_contents("http://url/zu/xml"); // XML von nem HTTP-Server ziehen
2$xml = new SimpleXMLElement($content); // In XML-Objekt transformieren
3echo json_encode($xml); // als json ausgeben ;)

..und das geht nicht nur mit dem xml-objekt :) http://php.net/manual/en/function.json-encode.php

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

06.05.2010, 23:04:57 via Website

Ach so... :)
Das hattest Du fast schon richtig:

1import org.json.JSONObject
2...
3HttpClient httpClient = new DefaultHttpClient();
4HttpGet request = new HttpGet(url);
5HttpResponse response = httpClient.execute(request);
6int status = response.getStatusLine().getStatusCode();
7if (status == HttpStatus.SC_OK)
8{
9 InputStream instream = response.getEntity().getContent();
10
11 BufferedReader reader = new BufferedReader(new InputStreamReader(
12 instream));
13
14 StringBuilder sb = new StringBuilder();
15
16 String line = null;
17 try
18 {
19 while ((line = reader.readLine()) != null)
20 {
21 sb.append(line);
22 sb.append('\n');
23 }
24 }
25 finally
26 {
27 is.close();
28 }
29
30 JSONObject json = new JSONObject(sb.toString());
31 ....
32}
33else
34{
35 ....
36}

Hmm.... ganz schön umständlich, fällt mir grad auf ;) Blöd dass es kein JSONObject-Contructor mit einem InputStream gibt. Und keine Methode im HTTPClient, die einen String zurückliefert. In der Standard-Implementation des Apache HTTPClient gibt es das, in der Android-Implementierung anscheinend nicht!?

— geändert am 07.05.2010, 08:44:21

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
ZoMtEc
  • Forum-Beiträge: 80

06.05.2010, 23:06:11 via Website

[quote=Kay J.]
Sven Woltmann
Oh, ich glaub du hast die frage falsch verstanden :D
den String zu generieren ist kein problem für mich, PHP ist quasi meine muttersprache in sachen programmieren :P es geht darum die entsprechende datei mit java(neuland für mich^^) zu downloaden und dann in ein java json object zu packen, ohne die datei erst auf dem gerät speichern zu müssen - was das einzige ist was ich bisher gefunden habe zu downloaden ^^

also quasi sowas wie:
1httpclient cli = new httpclient("http://my.host.com/daten.json");
2String jsonstring = cli.getAsString();
3JSONObject jObject; = new JSONObject(jString);

Wird doch schon langsam :) Kleiner Tipp...

1...
2DefaultHttpClient client = new DefaultHttpClient();
3HttpResponse res = client.execute(method);
4InputStream stream = res.getEntity().getContent();
5InputStreamReader reader = new InputStreamReader(stream);
6...

Antworten
ZoMtEc
  • Forum-Beiträge: 80

06.05.2010, 23:08:14 via Website

Sven Woltmann
Drumherum noch Exceptions abfangen, Fehler behandeln und fertig :)

Najaaa von zauberhand kommt das "result" auch nicht zustande :)

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

06.05.2010, 23:15:13 via Website

ZoMtEc
Najaaa von zauberhand kommt das "result" auch nicht zustande :)

Ja ist mir beim drüberschauen auch aufgefallen, dass ich hier noch einen Funktionsaufruf dazwischen hatte ;)
Hab den jetzt mal oben quasi inline eingefügt.

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

07.05.2010, 06:27:57 via App

Wow, danke fuer die ganzen Antworten. Selten eine so hilfswillige comunity gesehen!

Ich werd das heute Abend oder Morgen mal testen. :-)

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

07.05.2010, 08:46:14 via Website

Hab schnell noch was verbessert:

statt

1sb.append(line + "\n");

ist

1sb.append(line);
2sb.append('\n');

wesentlich besser, da aus dem ersten im Bytecode folgendes wird

1sb.append(new StringBuilder().append(line).append("\n").toString());

— geändert am 07.05.2010, 08:46:28

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
ZoMtEc
  • Forum-Beiträge: 80

07.05.2010, 10:07:25 via Website

Sven Woltmann
Hab schnell noch was verbessert:

statt

1sb.append(line + "\n");

ist

1sb.append(line);
2sb.append('\n');

wesentlich besser, da aus dem ersten im Bytecode folgendes wird

1sb.append(new StringBuilder().append(line).append("\n").toString());

Ich bezweifele, dass er bei json input überhaupt die zeilenumbrüche benötigt ;)

http://tools.ietf.org/html/rfc4627

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

07.05.2010, 11:02:38 via Website

ZoMtEc
Ich bezweifele, dass er bei json input überhaupt die zeilenumbrüche benötigt ;)

Das ist natürlich richtig! Wenn wir schon beim Optimieren sind, dann gleich richtig ;)

Dann sollte man natürlich auch gleich noch die Länge des Contents vorab auslesen und den BufferedReader mit einer passenden Buffer-Größe initialisieren und das nicht dem System überlassen ;)

— geändert am 07.05.2010, 11:04:52

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

07.05.2010, 13:21:37 via App

Sven Woltmann
Zu Deiner ersten Frage - ich würd sagen:

320x480 bei 160 dpi
480x800 bei 240 dpi
480x854 bei 240 dpi

mir ist heute vormittag beim drueber nachdenken eine interesannte frage zu den beiden 480x8** aufloesungen gekommen, wie sollen die beiden ordner heissen? drawable-large wäre für einen, aber für den anderen? oder gibts da noch ein trick den ich nicht kenne? :P

und wegen den posts zu json, ich kanns gar nicht erwarten es zu testen =D

Bis dann.


PS: Die AndroidPit app ist toll! <3

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

07.05.2010, 14:03:46 via Website

Halt, Du darfst "large" nicht mit der Auflösung verwechseln! "large" bezieht sich auf große Displays (z. B. bei WebPads), nicht auf normale Displays mit hoher Auflösung.

Du musst die Ordner "drawable" und "drawable-hdpi" nennen (dann wird für Displays mit niedriger Auflösung auch die Grafik aus "drawable" verwendet und runterskaliert).

Aber Du hast recht, 480x800 und 480x854 kannst Du nicht unterscheiden. Macht ja auch keinen großen Sinn da unterschiedliche Grafiken zu verwenden. Da würde ich halt in die Mitte ne Grafik setzen, die in der Höhe skaliert wird.

— geändert am 07.05.2010, 14:04:50

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

10.05.2010, 17:53:23 via Website

Huhu! :D

Bin am Wochenende leider nicht zum Testen oder so gekommen.^^

Aber hab das JSON auslesen gerade zum laufen bekommen :D
sogar der BufferedReader ist "optimiert" :P
1BufferedReader reader = new BufferedReader(new InputStreamReader(instream), (int)response.getEntity().getContentLength());
hoffe das ist richtig so *fg*
Bin nur ein wenig verzweifelt weil ich kein
1<uses-permission android:name="android.permission.INTERNET" />
in meiner Manifest.xml hatte >_<



Aber es sind auch schon neue Fragen aufgekommen :D
1) Da das App ja nur begrenzt Zeit hat auf bestimmte Events zu reagieren, habe ich den code derzeit in einem thread der in einem onclick event gestartet wird:
1public void onClick(View v) {
2 TextView txt = (TextView) findViewById(R.id.show);
3 txt.setText(test);
4 // Fire off a thread to do some work that we shouldn't do directly in the UI thread
5 Thread t = new Thread() {
6 public void run() {
7 try {
8 HttpClient httpClient = new DefaultHttpClient();
9 HttpGet request = new HttpGet("http://random.host.org/json.php");
10 HttpResponse response = httpClient.execute(request);
11 int status = response.getStatusLine().getStatusCode();
12 if (status == HttpStatus.SC_OK) {
13 InputStream instream = response.getEntity().getContent();
14 BufferedReader reader = new BufferedReader(new InputStreamReader(instream), (int)response.getEntity().getContentLength());
15 StringBuilder sb = new StringBuilder();
16 String line = null;
17 try {
18 while ((line = reader.readLine()) != null) {
19 sb.append(line);
20 }
21 } finally {
22 instream.close();
23 }
24 JSONObject json = new JSONObject(sb.toString());
25 test = json.getJSONArray("radio").getJSONObject(0).getString("name").toString();
26 } else {
27 }
28 } catch (IOException ex) {
29 Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
30 } catch (JSONException ex) {
31 Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
32 }
33 }
34 };
35 t.start();
36 }
wie man sieht, habe ich da auch schon mein folge problem "umgangen"... und zwar die tatsache, das man UI elemente nicht aus anderen threads als dem main thread updaten kann. doof hierbei ist quasi nur, das ich den button 2x drücken muss um das TextView zu updaten was allerdings das kleinere problem ist da es hier ja nur eine test implementation ist um das json überhaupt zu testen. meine frage nun ist, wie ich das am besten regel das die abfrage regelmässig läuft (etwa alle 30s bis 1m) und auf möglichst direktem weg in der lage ist, ein ui element zu aktualisieren. Mein erster gedanke waren Timer, googel hat mir mit folgendem geantwortet: http://developer.android.com/resources/articles/timed-ui-updates.html was ansich super klingt, da ich über die dort vorgeschlagenene handler lösung direkt auf meine ui elemente zugreifen kann. aber ich vermute "The Handler runs the update code as a part of your main thread"(Zitat vom letzten absatz auf der seite) hat wieder zur folge, das wenn mein code zu lange braucht es wieder probleme geben wird mit der reaktionszeit der app. daher würde ich mich über vorschläge/ideen freuen, wie ich es am besten lösen kann. :D

2) Ich habe das Playing from a File or Stream sample versucht auszuführen aber leider kommt da kein ton und nichts... (ich versuche ein shoutcast stream abzuspielen) habe hierzi zwar noch nicht viel gegoogeld, aber vielleicht hat ja jemand erfahrung damit und kann helfen! :)

3) Slow Emulator is SLOW! :( - Bei mir ist der Android Emulator endlos langsam... gibts da irgendwelche tricks die zu beschleunigen? oder vlt auf meinem handy(Motorola Milestone) die apps laufen zu lassen und debuggen? per usb oder wlan?
[UPDATE]Okay, habs hinbekommen :D http://developer.android.com/guide/developing/device.html[/UPDATE]

Vielen Dank im vorraus :)

— geändert am 10.05.2010, 18:11:52

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

10.05.2010, 23:32:58 via Website

Kay J.
sogar der BufferedReader ist "optimiert" :P
1BufferedReader reader = new BufferedReader(new InputStreamReader(instream), (int)response.getEntity().getContentLength());
hoffe das ist richtig so *fg*

Für JSON-Objekte sollte das eigentlich OK sein. Wenn Du größere Datenmengen erwartest allerdings nicht, dann solltest Du die Buffergröße nach oben auf einen sinnvollen Wert begrenzen (1kb oder so).

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

10.05.2010, 23:36:18 via Website

Kay J.
wie man sieht, habe ich da auch schon mein folge problem "umgangen"... und zwar die tatsache, das man UI elemente nicht aus anderen threads als dem main thread updaten kann.

Dafür gibt's ne ganz einfache Lösung :)

Definiere einen Handler in Deiner Activity:

1private final Handler mHandler = new Handler();

Und dann kannst Du aus Deinem Thread das UI wie folgt updaten:

1mHandler.post(new Runnable(){
2 public void run()
3 {
4 TextView txt = (TextView) findViewById(R.id.show);
5 txt.setText(test);
6 }
7});

Zu 2) kann ich nichts sagen, habe bisher noch keine Musik abgespielt.

— geändert am 10.05.2010, 23:38:01

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

11.05.2010, 10:15:12 via App

okay, danke :) aber wie mach ich das mit dem regelmäßig am besten? ich würde sagen mit der handler sache cvom dem post über timer und da drin dann den thread starten, oder? :D

werds heute abend nach der arbeit mal testen.

mfg

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

11.05.2010, 10:45:29 via Website

Ich hab nicht verstanden was genau Du "regelmäßig" machen willst.
Das UI updaten reicht doch einmalig, nachdem Du die Daten geladen hast.

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Kay J.
  • Forum-Beiträge: 59

11.05.2010, 13:08:14 via App

neue daten laden und diese anzeigen. :)

ich habe 2 datenquellen wovon eine alle 60sek und die andere alle 5min aktualisiert wird.

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

11.05.2010, 13:28:34 via Website

Du kannst z. B. mit dem ScheduledThreadPoolExecutor (falls es den unter Android gibt, ansonsten etwas ähnliches) eine Runnable automatisch in einem bestimmten Interval im Hintergrund laufen lassen. Aus der heraus führst Du Deine Aktionen durch und aktualisiert dann über den Handler das UI.

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

11.05.2010, 15:00:41 via Website

ScheduledThreadPoolExecutor denn gibt es, er rennt bei mir z.b in meinem Service!

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Kay J.
  • Forum-Beiträge: 59

12.05.2010, 17:27:35 via Website

Sven Woltmann
Kay J.
wie man sieht, habe ich da auch schon mein folge problem "umgangen"... und zwar die tatsache, das man UI elemente nicht aus anderen threads als dem main thread updaten kann.

Dafür gibt's ne ganz einfache Lösung :)

Definiere einen Handler in Deiner Activity:

1private final Handler mHandler = new Handler();

Und dann kannst Du aus Deinem Thread das UI wie folgt updaten:

1mHandler.post(new Runnable(){
2 public void run()
3 {
4 TextView txt = (TextView) findViewById(R.id.show);
5 txt.setText(test);
6 }
7});

Ich habe das jetzt versuchsweise in Verbindung mit dem vorgeschlagenen ScheduledThreadPoolExecutor bzw um genau zu sien mit ScheduledExecutorService (gibts da einen bedeutenden unterschied?) umgesetzt. Frage mich grade nur ob ich dem Handler/Runnable irgendwie parameter übergeben kann. sprich zb den neuen String, der bisher noch ein "private String test;" der Activity ist. Ich habe entweder an ein array mit viewID/string pärchen, so das ich 1 runnable quasi für alles verwenden kann, oder jetzt speziell in dem fall der json daten, das json objekt rüberreichen (wobei ich dies, dann auch als member der activity machen könnte) oder macht es sinn den runnable als eigene klasse zu machen die von "Runnable" erbt und dann entsprechende set/get funktionen hat? Hab ich dann überhaupt die möglichkeit das ui von der klasse aus zu verändern? Sollte ja, da der handler den code im main thread ausführt und es da ja egal sein sollte welche klasse/funktion da was ändern will oder? :D


PS: meine App kann schon ":D"s Spammen, ich glaube die könnte ein erfolg werden *fg* <3

— geändert am 12.05.2010, 17:52:46

Antworten
Sven Woltmann
  • Admin
  • Staff
  • Forum-Beiträge: 1.922

12.05.2010, 21:16:11 via Website

Hi,

wenn ich Deine Frage richtig verstehe, dann hat der Handler schon alles was Du brauchst. Du kannst ihn wie folgt verwenden:

1protected final Handler mHandler = new Handler()
2 {
3 @Override
4 public void handleMessage(Message msg)
5 {
6 switch (msg.what)
7 {
8 case [...]
9 }
10 }
11 }

Dann kannst Du einen einzigen Handler verwenden und in Abhängigkeit von der Message verschiedene Aktionen ausführen. Der Message kannst Du noch zwei ints und ein Object mit auf den Weg geben.

Svens Java-Entwickler-Blog: https://www.happycoders.eu

Antworten