Hallo zusammen.
Bin noch recht neu in der Java/Android Welt.
Ich erstelle eine App in der ein ImageView (Bild mit einem roten WiFi Symbol) über einem anderen ImageView (Fotoanzeige) liegt.
Da die App auf WLAN angewiesen ist, will ich ein Hintegrundthread erstellen, welcher alle 3 Sekunden den aktuellen WiFiStatus abruft und bei unterschreitung eines Pegels ein ImageView (Bild mit einem roten WiFi Symbol) einblendet.
Ich starte aus "onCreate" den Hintegrundthread (WiFiUeberwachung), welcher in der Endlosschleife den Status abruft.
Je nach Wert, will ich das besagte ImageView ein bzw. ausblenden.
Dieser Thread blendet beim Start das ImageView aus. Wenn es aber wieder eingeblendet werden soll, stürzt die App ab und meldet
"android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Bei Stackoverflow gibt es verschiedene Lösungsansätze wie z.B. den hier.
Da komme ich aber nicht weiter. Wenn dort die while(true) Schleife einbaue, friert die App schon beim Start ein.
Hat jemand ne Idee, wie man den folgenden (meinen) Code anpassen kann.
Hat jemmand ne Idee?
Danke
Bin noch recht neu in der Java/Android Welt.
Ich erstelle eine App in der ein ImageView (Bild mit einem roten WiFi Symbol) über einem anderen ImageView (Fotoanzeige) liegt.
Da die App auf WLAN angewiesen ist, will ich ein Hintegrundthread erstellen, welcher alle 3 Sekunden den aktuellen WiFiStatus abruft und bei unterschreitung eines Pegels ein ImageView (Bild mit einem roten WiFi Symbol) einblendet.
Ich starte aus "onCreate" den Hintegrundthread (WiFiUeberwachung), welcher in der Endlosschleife den Status abruft.
Je nach Wert, will ich das besagte ImageView ein bzw. ausblenden.
Dieser Thread blendet beim Start das ImageView aus. Wenn es aber wieder eingeblendet werden soll, stürzt die App ab und meldet
"android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Bei Stackoverflow gibt es verschiedene Lösungsansätze wie z.B. den hier.
Da komme ich aber nicht weiter. Wenn dort die while(true) Schleife einbaue, friert die App schon beim Start ein.
Hat jemand ne Idee, wie man den folgenden (meinen) Code anpassen kann.
Java:
.
.
.
public ImageView WiFiWarning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
WiFiWarning=findViewById(R.id.WiFi_Warning);
//einmalige Prüfung der WiFi Verbindung (klappt perfekt)
if(CheckWiFiQuality()<4){WiFiWarning.setVisibility(View.VISIBLE);}else{WiFiWarning.setVisibility(View.INVISIBLE);}
//alle 3 Sekunden den Status prüfen und bei Bedarf WiFiWarning ein/ausblenden
WiFiUeberwachung(3000,4);
Java:
//Thread für eine kontinuierliche Überwachung der WiFi Verbindung
public void WiFiUeberwachung(long warteZeit, int minSignalstaerke){
AsyncTask.execute(() -> {
try {
while(true) {
Thread.sleep(warteZeit); //warte X Sekunden
//in der folgenden Zeile schmiert die App ab, wenn das ImageView(WiFiWarning) eingeblendet werden soll. Ausblenden klappt wie gewollt.
if(CheckWiFiQuality()<minSignalstaerke){WiFiWarning.setVisibility(View.VISIBLE);}else{WiFiWarning.setVisibility(View.INVISIBLE);}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
//Liefert als Antwort eine Zahl zwischen 1 und 5 (1=ganz schlecht, 5 sehr gut)
private int CheckWiFiQuality()
{
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
// Level of a Scan Result
List<ScanResult> wifiList = wifiManager.getScanResults();
for (ScanResult scanResult : wifiList) {
int level = WifiManager.calculateSignalLevel(scanResult.level, 5);
System.out.println("Level is " + level + " out of 5");
return level;
}
return level;
}
Hat jemmand ne Idee?
Danke