Hallo ThomasDroid,
ja, ich hatte die Klammer falsch gesetzt (siehe Nachtrag)
Danke
Hallo ThomasDroid,
ja, ich hatte die Klammer falsch gesetzt (siehe Nachtrag)
Danke
Hallo an alle und danke für die posts,
also was ich am code von lucas nicht verstanden habe ist "Song".
wenn ich das so übernehme steht beim List<Song>: Song cannot be resolved to a type
keine ahnung wie ich das fixe (sry, aber ich muss noch einiges lernen ), aber egal, den prinzip habe ich verstanden. wobei wenn das letzte element von itemscopy beispielsweise eine 5 wäre, welches dann gelöscht wird dann wäre itemscopy = 0. somit wäre die if-bedingung erfüllt und itemscopy bekommt alle elemente von allitems zugewiesen, welches dann zufällig gemischt wird. dann wird wieder das 1. element genommen, welches aber auch die 5 sein kann. d.h. es wäre dann 2 mal hintereinander gezogen worden. naja... wenn das alle 5 schritte passieren kann ist das nicht so tragisch. aber zurück zum code: wie gesagt, ich habe das mit der methode Song nicht so verstanden und habe das dann so gemacht um zu checken, ob keine gleichen zahlen hintereinander aufgelistet werden:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List<Integer> list2 = new ArrayList<Integer>(list);
Random r = new Random(System.nanoTime());
int i = 0;
while(i != 16) {
if(list2.size() == 0) {
list2 = list;
Collections.shuffle(list2, r);
}
int b = list2.get(0);
System.out.println(b);
list2.remove(b);
i++;
}
Alles anzeigen
so, normalerweise sollte es mir 16 zahlen zurückgeben. was ich bekomme ist aber seltsamerweise das hier:
1
1
1
1
1
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at Main.main(Main.java:32)
NACHTRAG:
upss, habe die klammer falsch gesetzt (peinlich peinlich)
Guten morgen,
ich stehe etwas auf dem Schlauch, um eine Zufällige Zahl aus einem int[5] array ohne wiederholung zu generieren. Bei nur 5 Zahlen kommt es schon oft vor, dass die gleichen Zahlen hintereinander gewählt werden. Dann dachte ich mir die generierte zahl zwischen zu speichern um bei der nächsten generierung diese mit der neu generierten Zahl zu vergleichen. Falls diese dann gleich sein sollten, sollte dann so lange eine zahl generiert werden, bis diese sich mit der zwischen gespeicherten unterscheidet. Aber das würde eventuell auch länger dauertn, weil wie gesagt, kam es schon vor, das die gleiche zahl 4-5 mal hintereinander gewählt wurde. Das wäre also keine optimale lösung. Hat jmd. da vielleicht einen Tip??
So weit bin ich momentan:
Random r = new Random();
int i;
int [] arrayList = {13,32,44,33,99};
i = arrayList[r.nextInt(arrayList.length)];
danke im Voraus
Krass, das hat echt funktioniert
Danke lucas
PS: kannste mir den link geben, wo du das her hast?
Hallo an alle,
also bis vor ein paar Tagen hat der Geocoder noch schön die adressen ausgegeben. Seid gestern als ich meine app unterwegs getestet habe, bekam ich plötzlich keine adressen mehr angezeigt. Das hatte mich doch sehr gewundert. Am Code habe ich nichts verändert gehabt. Ist auch das gleiche Smartphone mit der gleichen os-version. Nun, jetzt sitzte ich seid einer stunde vor dem rechner um nachzusehen, ob am code doch was nicht stimmt. Aber der code ist vollkommen ok (ist halt der selbe wie vor einigen tagen, wo es gefunzt hatte). Habe log-ausgaben eingetragen und bekomme nun die Service not available meldung. Ist das ein service was offline ist, oder was soll das sein?? Weil, wie gesagt, ich habe NICHTS gemacht und plötzlich geht es nicht mehr. das kann doch nicht sein.
Habe ein wenig gegoogelt und es scheint ja kein unbekanntes problem zu sein. Muss ich jetzt den code ändern?? Warum hat es dann noch vor kurzem geklappt?? ey sowas kann so früh am morgen doch recht einen aufregen ...
also ich bin da überfragt schymura.
Also ich zitiere mal aus einem Buch:
ZitatAlles anzeigenSo gut wie jedes Smartphone hat Zugriff auf Google Maps, und es ist technisch möglich, Karten dieses Dienstes in eigene Apps einzubinden. Allerdings gibt es zwei Nachteile:
1. Um in einer App Google Maps nutzen zu können, benötigen Sie einen API Key. Der kostet zwar nichts, aber es ist etwas umständlich, ihn zu beschaffen.
2. Die Lizenzbedingungen von Google Maps sind kompliziert und verbieten alles Mögliche, zum »Ausgleich« erlauben Sie jedoch Google, die Bedingungen jederzeit einseitig zu verändern.
... daher eine andere Methode: mapsforge. Das ist ein Open-Source-Projekt, das auf dem Kartenmaterial von Openstreetmaps.org (OSM) basiert. Es wird ähnlich Wikipedia von der Community gepflegt, d. h., auch Sie können ein fehlendes Toilettenhäuschen einzeichnen oder eine verrutschte Bushaltestelle an die richtige Stelle schieben.
Zu Mapsforge:
Entwickelt und zur Verfügung gestellt wird mapsforge von der Freien Universität Berlin. Wenn Sie möchten, können Sie das Kartenmaterial sogar auf der SD-Karte Ihres Handys speichern. Das spart Datenverkehr, und die Darstellung ist viel schneller,
weil die Karten nicht aus dem Internet nachgeladen werden müssen. Dafür erwartet Sie ein einmaliger Download von nicht unwesentlichen Ausmaßen: 1 GByte umfasst beispielsweise die Karte Deutschlands. Sie können aber auch kleinere Karten herunterladen, etwa von den Bundesländern. Sie finden den Download-Bereich für Deutschland hier:
ftp://ftp.mapsforge.org/maps/europe/germany/
Die Webseite des mapsforge-Projekts finden Sie unter:
http://mapsforge.org
Dort finden Sie auch weitere Dokumentationen.
....
Man kann beide Karten nutzen. Ich habe es mal mit osm versucht und auch hingekriegt und nun auch mit google maps v2. Wie im Zitat steht braucht man für die Nutzung des google maps einen API-KEy. Diesen bekommst du bei googel-apis-console. Dafür brauchst du wiederum einen google-account. Dort wird ein key generiert, indem du einen SHA1-Zertifikat Fingerabdruck und dem paketnamen deines android-projektes einträgst. Diesen key musst du dann in die manifest.xml eintragen etc. etc. etc.
hier gibt es eine step-by-step anleitung:
Dort stehen auch die Bedingungen für die Nutzung von GoogleMaps.
Für mich war es am Anfang voll kompliziert, bis man das alles konfiguriert hat und so... voll der Film. Bei OSM machst du solche sachen nicht und benötigst lediglich nur eine Bibliothek des kartenmaterials. Da gibt es halt z.b. mapsforge, osmdroid... Von der Implementierung her war es für mich für die darstellung einer karte mit osm vieeeel einfacher. Der Aufwand ist auf jeden fall geringer (meine meinung). Bei osm brauchst du soweit ich weis keine lizenz. Musst du auf jeden mall testen. Mal mit osm und mal mit google maps v2 um selber einen Eindruck zu gewinnen. Im Internet gibt es etliche (video-)tutorials.
ZitatWie berechnet man bei Vektorkarten was und wie man den Kartenauschnitt(Tiles) anzeigt?
was für berechnungen meinst du?
grüße
Mit dem AsyncTask hat es wunderbar geklappt. Danke dir
Also ich habe folgendes mal ausprobiert. Wie ihr bereits gesagt habt, habe ich in der onLocationChanged()-Methode viel zu viele aufgaben bzw. aufrufe gehabt, die so oft wie möglich durchgeführt wurden. der UI-thread war daher zu sehr ausgelastet und deshalb ziemlich laggy. Habe daher einiges in AsyncTasks eingebaut um den uithread zu entlasten bzw. das diese dann auch parallel laufen. die updates sollten zudem alle 6 sekunden gemacht werden. Bin dann etwas durch die gegend gecruiset um zu testen, ob es immer noch laggy ist. Und siehe dar, es funzte diesmal ziemlich gut und viiieeel flüssiger. Das Resultat hat mich sehr erfreut. Zudem muss ich sagen, dass asynctasks generell doch eine bessere Variante sind als threads. Mit besser meine ich jetzt die IMplementierung. Finde ich einfacher . Ich werde es mal noch den Mediaplayer in einen service packen. vielleicht kann man von der effizienz noch etwas mehr rausholen. Danke auf jeden fall für die tipps, ratschläge und hilfsbereitschaften. Alter.. ihr seid die besten. (yippi ya yeah)
Hallo leude,
danke für eure posts
Also den MediaPlayer als Service zu nutzen ist wahrscheinlich eine bessere Idee. Müsste mich mal in Services reinarbeiten. Und der Mediaplayer greift auf ressourcen-interne datein zu. Also kein musikstreaming aus dem internet oder sowas und auch kein zugriff auf sdcard-datein. Habe jetzt grob nur zum testen im res/raw-ordner ein paar Musikstücke (10 tracks) gepackt, auf die der Mediaplayer zugreift. Aus dem Internet hole ich mir lediglich nur Umfeldinformationen. In welchen Abständen diese Abfragen gemacht werden, hängt von der Einstellung der requestLocationUpdates()-Methode ab. Am anfang hatte ich es halt auf 0 gesetzt, d.h. jede Sekunde eine Anfrage. Ok, das war eigentlich nicht nötig und überlüssig zugleich, weil die App sozusagen erst Musikstücke automatisch abspielt, wenn die Informationen aus dem Netz abgerufen wurden. Und wenn ich am einem Punkt verharre, ist es auch nicht nötig die gleichen parameter aus dem Netz zu ziehen. Daher habe ich jetzt minDistance eingestellt (werde ich später mal testen ).
@lucas:
ZitatNavigon und Konsorten rufen die Ortsbestimmung ab, doch das geschieht über Location Services, nicht über das Internet.
das tue ich doch auch. Also kein Internet. Daher habe ich mich doch gewundert.
Locationmanager lm;
lm = (LocationManager)getSystemService(LOCATION_SERVICE);
provider = LocationManager.GPS_PROVIDER;
Location location = lm.getLastKnownLocation(provider);
if(provider != null ) {
onLocationChanged(location);
}
lm.requestLocationUpdates(provider, 0, 30, this);
...
Alles anzeigen
Aber das du folgendes gemeint hast ist doch ein interessanter Punkt:
ZitatAlles anzeigen...das ist völlig okay und der Stromverbrauch ist konstant hoch. Das wird
nicht weniger, wenn du einen Zeitintervall einstellst. GPS funktioniert
nur mit permanenter Verbindung. Die Timeouts, die du einstellst, sind
lediglich Schwellwerte an denen das Betriebssystem dir die neuen Daten
mitteilt. Ob du jetzt jede geänderte Location mitnimmst oder dich nur
alle 15 Minuten informieren lässt ist irrelevant für den Stromverbrauch
des GPS Modems.
Klingt eingentlich nachvollziehbar und logisch. Weil aus einem Buch habe ich entnommen, dass der stromverbrauch auf ein maximum ist, wenn die werte auf 0 gesetzt sind, weil die aktuelle position so oft wie möglich gegeben wird. Jetzt wird mir doch einigeres deutlicher
danke danke danke. Ich werde es mal ausprobieren und poste meine resultate
Hallo schymura,
da wir jetzt von der onlocationchanged()-Methode reden, wie würde denn diese reagieren, wenn ich in die lochationmanager.requestLocationUpdates(provider, 0, 0, locationlistener) - methode für die erste null 6000 und für zweite 30 eintrage? die 1. zahl ist ja long minTime (in millisekunden). die 2. float minDistance (in metern). Wenn ich jetzt nur die 6000 eintrage, dann reagiert der locationmanager alle 6 sekunden. Wenn ich nur die 30 eintrage alle 30 meter. Und was passiert wenn ich beides eintrage? Wird dann gecheckt, welches der beiden zutrifft?
hally schymura,
danke für deinen post. Ne ne... ich habe mich falsch ausgedrückt. was ich sagen wollte ist, dass die app generell musik abspielt als auch den standort über eine karte anzeigt. der standort wird natürlich über onLocationChanged() aktualisiert, das ist standart . Was ich sagen wollte ist, das wenn die app läuft, 1. der standort über eine karte angezeigt zudem 2. musik abspielt und 3. eine internetabfrage gemacht wird. Alles parallel. ich nutzte auch eine swipeview, womit ich zwischen zwei ansichten, indem fall einer karte und einem mediaplayer, wechseln kann. der mediaplayer enthält auch eine seekbar, welches beim abspielen eines musikstückes sich bewegt. wie gesagt, geschieht das alles parallel. Daher ist mir auch klar warum das so rechenintensiv ist. Aber bestimmt könnte man hier und da noch etwas schleifen.
Ich habe eine generelle Verständnisfrage. Und zwar, ist es ressourcenfreundlicher und effizienter bei der implementierung einer App, wenn man extra Klassen für Methoden (es sind jetzt nicht alle Methoden gemeint) erstellt (also die aufgaben in klassen aufteilen)? Also ich habe nämlich eine App programmiert, die aus 9 Klassen besteht. Eine der Klassen ist die MainActivity. Diese enthält die meisten Methoden. Die app nutzt einen Mediaplayer bzw. google maps v2 für eine ortsbestimmung, gesteuert alles durch die MainActivity. Hinzukommt, dass aus der MainActivity ein Thread im hintergrund parallel ausgeführt wird (für internetabfragen und zwar jede sekunde, da ich requestLocationUpdates auf 0 gesetzt habe, jetzt habe ich aus auf 5 sekunden eingestellt). Das ist sehr rechenintensiv und nutzt viel energie, was verständlich ist. Aber es gibt andere Apps, wie z.b. navigon, welches auch jede sekunde die ortspositionen aktualisiert, warnungen gibt etc. etc. Solche apps laufen ziemlich gut und flüssig auf meinem smartphone. Und obwohl ich für das Testen meines apps auch den Galaxy S2 nutze, dessen Rechenleistung ziemlich gut ist, laggt es wie sau. Daher meine Frage. Kann das daran liegen, das alles aus der einen Klasse gesteuert wird oder macht das keinen unterschied? Kann natürlich auch an meiner Programmierung selbst liegen. Ich bin ja nicht so der programmier-experte (das habt ihr bestimmt an meinen erstellten themen bereits festgestellt ) und weiß daher nicht ob ich das so gut hingekriegt habe. Funktionieren tut es zumindestens, aber ist halt seeeehr rechenintensiv was das interagieren mit dem user beeinträchtigt. Wie könnte man dagegen vorgehen? Gibt es eventuell irgendwelche Tipps, tutorial etc. für die Programmierung der oben genannten Funktionen, die die Rechenleisung nicht auf ein maximum stellen?
Danke im Voraus
@Lucas:
Stimmt, du hast recht. Habe ich völlig vergessen. Die Threads werden ja parallel im Hintergrund ausgeführt, während der UI-Thread weiter macht. Wenn ich den blockieren würde, bis die Threads abgearbeitet und geschlossen wurden, wäre das keine gute Lösung. ok... dann mache ich das mal anders. Eine andere Frage: ich dachte mit dem handler ein callback-mechanismus implementiert zu haben!? (siehe code: handler.post(new Runnable() { ... }); ). Könntest du mir einen Beispiel geben wie du das gemeint hast? (allgemein gefragt)
@block
ah ok. Gut zu wissen. danke
@lucas de vil
ne ne, ich nutze keine weiteren bool-werte. zuweisung ist schon richtig. aber bekomme nicht du gespeicherten werte, hmm... !?
ne das bringt nichts. habe doch vorher geschrieben, dass ich mit log-einträgen gecheckt habe, was für werte aufgerufen werden. es sind false werte
Also ich weiß nicht ob ich zu kompliziert denke, aber was ich will ist nur bool-werte die über einen thread festgelegt werden in einer anderen klasse speichern. Auf diese klasse bzw. werte, möchte ich dann aus der Mainactvity zugreifen können.
Ich bin bis jetzt folgendermaßen vorgegangen:
Die onCreate()-Methode der MainActvity (rest ist egal):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setSectionPagerAdapter();
playList = (TextView)findViewById(R.id.textView_playlist);
String testUrl1 = "http://google.de"; //testURL
String testUrl2 = "http://facebook.com"; //testURL
try {
URL url1 = new URL(testUrl1);
ccThread = new ConnectionControlThread(url1);
Thread thread1 = new Thread(ccThread);
thread1.start();
}
catch (Exception e) {
Log.e("Service", "" + e);
}
try {
URL url2 = new URL(testUrl2);
ccThread = new ConnectionControlThread(url2);
Thread thread2 = new Thread(ccThread);
thread2.start();
}
catch (Exception e) {
Log.e("Service", "" + e);
}
Log.d("TEST3", "" + ServerOnlineCheck.isServerAisOnline() + ServerOnlineCheck.isServerBisOnline());
if(ServerOnlineCheck.isServerAisOnline() == false && ServerOnlineCheck.isServerBisOnline() == false) {
showServerUnreachableMessage();
}
}
Alles anzeigen
Thread
public class ConnectionControlThread implements Runnable {
URL website;
Handler handler = new Handler();
ServerOnlineCheck onlineCheck = new ServerOnlineCheck();
boolean serviceAvailable;
public ConnectionControlThread(URL url) {
this.website = url;
}
public int setIntForURL() {
int i = 0;
String websiteAsString = website.toString();
if(websiteAsString.contains("google")) {
i = 1;
}
if(websiteAsString.contains("face")) {
i = 2;
}
return i;
}
@Override
public void run() {
try {
HttpURLConnection httpURLConnection = null;
httpURLConnection = (HttpURLConnection) website.openConnection();
httpURLConnection.setReadTimeout(30000); //30 seconds timeout in milliseconds
httpURLConnection.setConnectTimeout(5000); //5 seconds timeout in milliseconds
// Start connection
httpURLConnection.connect();
InputStream response =httpURLConnection.getInputStream();
Log.d("Response:", response.toString());
if (httpURLConnection.getResponseCode() == 200) { // HTTP-Statuscode: 200 ist Ok! (siehe wikipedia)
serviceAvailable = true;
}
else {
serviceAvailable = false;
}
}
catch (IOException e) {
Log.e("TAG", e.getMessage());
}
handler.post(new Runnable() {
@Override
public void run() {
if(setIntForURL() == 1) {
onlineCheck.setServerAisOnline(serviceAvailable);
Log.d("TEST1", "" + onlineCheck.isServerAisOnline());
}
else {
onlineCheck.setServerBisOnline(serviceAvailable);
Log.d("TEST2", "" + onlineCheck.isServerBisOnline());
}
}
});
}
}
Alles anzeigen
die klasse wo die bool-werte gespeichert werden:
public class ServerOnlineCheck {
static boolean serverAisOnline;
static boolean serverBisOnline;
public static boolean isServerAisOnline() {
return serverAisOnline;
}
public static boolean isServerBisOnline() {
return serverBisOnline;
}
public void setServerAisOnline(boolean serverAisOnline) {
this.serverAisOnline = serverAisOnline;
}
public void setServerBisOnline(boolean serverBisOnline) {
this.serverBisOnline = serverBisOnline;
}
}
Alles anzeigen
Könnte jmd. eine simples beispiel eventuell posten, wo man über der oncreate()-methode der mainActivity einen thread ausführt, der eine url nach dem status ceckt und das ergebnis als bool-wert in einer separaten klasse speichert und letztendlich an eine textview übergibt? man könnte dafür die meisten codes von oben verwenden. ich danke im voraus für die hilfen und ratschläge
block_
habe dein post gerade gelesen. Ähm.. ja genau so sieht es aus
Aber wie können die werte false sein? diese werte gebe ich doch über den thread? bei der deklaration habe ich zumindestens keine werte zugewiesen (siehe code). wie sollte/könnte man das dann lösen?
Ich habe probleme mit boolean werten. Und zwar überprüfe ich in meinem android projekt über ein thread den onlinestatus zweier url's. der thread wird über die MainActvity.onCreate()-methode ausgeführt. im thread wird ein boolean attribut auf false gesetzt, wenn der url's nicht erreichbar sind, sonst true. diesen wert gebe ich dann an eine klasse weiter, die die boolean-werte speichert (get-set methoden). ich habe es mit log-einträgen überprüft, welches mir stets die richtigen werte nach der übergabe angezeigt hat. wenn die server aber nicht online sind, dann soll es eine nachricht ausgeben. dazu habe ich in der MainActvity.onCreate()-methode (nach den try-catch-blöcken) eine if-bedingung eingeführt, die folgendermaßen aussieht:
if(!ServerOnlineCheck.isServerAisOnline() && !ServerOnlineCheck.isServerBisOnline()) {
showServerUnreachableMessage();
}
und obwohl die server online sind und auch über den log-eintrag die gespeicherten boolean-werte true sind, wird die showServerUnreachableMessage(); ausgeführt. habe dann davor auch log-einträge gemacht um zu sehen was für boolean-werte gespeichert sind bzw. von der if-bedingung aufgerufen werden und es sind false werte. wieso sind die false? Die true false-werte werden nur über den thread übergeben. über logeinträge sehe ich dass diese ture sind und später dann false. (kopfkratz)
kann mir das einer erklären?? Ich raffe das nicht
danke im voraus
ne, also auf dem htc funzt es auch nicht (würde mich auch wundern). also ich bin mit meinem latain am ende. ich habe alles mögliche von der mainactivity entfernt (eigentlich unnötig aber egal), sodass ich nur noch die onCreate und die anderen zwei mehtoden habe. Berechtigungen sind auch gesetzt. Du hast den code getestet und es geht, d.h. es müsste dann auch bei mir gehen, was es aber nicht tut. ich weiß ehrlich nicht weiß ich falsch mache, habe inzwischen auch ein neues projekt erstellt um nur connection zu testen. das gleiche resultat. Killphil75, könntest du freundlicherweise mir mal dein projekt schicken oder hochladen, womit du die connection geprüft hast? das wäre echt korrekt
ich teste es auf meinem galaxy s2 (android-version 4.1.2). Hmm... das ist echt merkwürdig. Kann es an meinem smartphone liegen?? ich habe nämlich mal ein problem gehabt, dass ich ein anderes projekt auf meinem galaxy getestet habe, welches fehlerhaft war. es lag aber nicht am code. ich habe gegrübelt und gegrübelt, bis ich es auf einem htc mit der version 4.1.1 getestet hatte. un da hat es fehlerfrei gefunzt.
irgendwie ergibt das für mich keinen sinn, aber ich werde es mal testen.
bis auf
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
und
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
habe ich die anderen berechtigungen. Sind diese zwei erforderlich?