Android Studio: Unendliche while-Schleife?
Guten Tag,
ich würde gerne einen Zähler erstellen, der in dem Log von 0 hochzählt, ohne ein Ende.
Dies habe ich versucht, so zu machen:
package com.example.zhler;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Integer integer = 0;
while (true) {
Log.i("Die Zahl lautet ", String.valueOf(integer));
try {
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException e) {
e.printStackTrace();
}
integer = integer + 1;
}
}
}
Dies klappt super, nur habe ich das Problem, das jetzt grafisch irgendwie nichts mehr angezeigt wird. Ich habe nur ein weißes Bild, wenn ich die App öffne. Wenn ich in die Schleife "break;" reinschreibe habe ich wieder meine grafische Oberfläche.
Hat jemand einen Lösungsvorschlag?
Vielen dank schon einmal für die Hilfe.
package com.example.zhler;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Integer integer=0;
while (true){
Log.i("Die Zahl lautet ", String.valueOf(integer));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
integer = integer + 1;
}
}
}
2 Antworten
Das liegst dadran dass on create (was ja ganz am Anfang läuft), so unendlich lange braucht und der Rest nie ausgeführt wird.
Du musst mit timern und Threads arbeiten.
https://developer.android.com/reference/java/util/Timer
Oder (neuer, und ich finde, besser)
https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor
Wenn du des Englischen mächtig bist, lies einmal https://developer.android.com/guide/components/processes-and-threads
Mit dem sleep im UI Thread legst du die Oberfläche lahm. Du brauchst einen 2. Thread, der die Arbeit (=Schlafen ;) ) erledigt, damit der UI Thread weiterhin reagiert. Oder halt AsyncTask oder Worker oder einen der anderen Android-Machnismen dafür.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
public void run() {
Integer integer=0;
while (true){
Log.i("Die Zahl lautet ", String.valueOf(integer));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
integer = integer + 1;
}
}).start();
}
...ungetestet, habe keine Android-IDE da.
Für den extrem simplen Fall, den du hier hast: die von iQa1x skizzierte Lösung wird wohl reichen. Mal abgesehen von Unschönheiten: Log.i() ist nicht so gedacht (der erste Parameter ist ein Tag, der zweite die Lognachricht), und der Handler von InterruptedException sollte im einfachsten Fall ein "break;" sein, damit der Thread tatsächlich beendet werden kann.
Für eine echte App wirst du dich mit den Mechanismen von Android auseinandersetzen müssen, wie man effizient Hintergrundjobs abarbeitet. Außerdem ist es selten der Fall, dass Threads völlig unabhängig sind: sie konsumieren oder produzieren Daten von bzw. für andere Threads, und das muss man sauber synchronisieren.
Also gibts da keine simple Lösung die ich als Laie auch umsetzen könnte :/?