Android Studio: Unendliche while-Schleife?


26.04.2020, 14:38
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

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.

Woher ich das weiß:Berufserfahrung – Softwareentwickler & Admin

pablo37 
Fragesteller
 26.04.2020, 14:53

Also gibts da keine simple Lösung die ich als Laie auch umsetzen könnte :/?

0
jort93  26.04.2020, 14:55
@pablo37

Das ist als Laie umsetzbar, musst dich nur eben Richtung Threads informieren. Nach ein paar Wochen ist das machbar denke ich.

2
iQa1x  26.04.2020, 15:04
@pablo37
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.

1
pablo37 
Fragesteller
 26.04.2020, 15:18
@iQa1x

Werde es später mal probieren obs funktioniert oder nicht, Vielen Dank :)

0
mertkert  26.04.2020, 15:26
@pablo37

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.

2