NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze: Android aplikace - Async a UI

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Neaktivní uživatel:24.3.2020 14:14

Ahoj,
abych nastínil svůj problém:
Mám MainActivity a SocketThread. Socket thread se stará o komunikaci a v případě příchozí zprávy vyvolává callback do MainActivity, kam předá zprávu.

v onCreate v MainActivity

socketServerThread.registerServerListener(this);

a listener:

public void onMessageRecieved(String message) {
    infoip.setText(message);
    Log.d("DBG",message);
}

V SocketThreadu pak:

public void registerServerListener(IServerListener mListener) {
    this.serverListener = mListener;
}

a vyvolání callbacku:

if (this.serverListener != null) {
                    serverListener.onMessageRecieved(message);
                }

Problém je, že callback se sice vyvolá a zpráva se vypíše do konzole, ovšem do UI komponenty se nezapíše. S multithreadovými aplikacemi nemám moc zkušeností, takže prosím o konkrétní radu. Díky.

Odpovědět
24.3.2020 14:14
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Donát:24.3.2020 15:22

Ahoj, v Androidu nemůžeš šahat na view komponenty z jiného vlákna, než hlavního aplikačního. Pokud chceš změnit text například v TextView z jiného vlákna, je potřeba to spustit na hlavním UI vlákně. K tomu slouží metoda runOnUiThread přímo v aktivitě, viz dokumentace).

Pokud máš ten listener přímo někde v aktivitě, lze poté napsat:

public void onMessageRecieved(String message) {
        runOnUiThread(() -> {
                infoip.setText(message);
        });
        Log.d("DBG",message);
}

Pokud je kód umístěn mimo aktivitu, lze to zapsat tímto způsobem:

public void onMessageRecieved(String message) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(() -> {
                infoip.setText(message);
        });
        Log.d("DBG",message);
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.3.2020 15:22
Avatar
Odpovídá na Martin Donát
Neaktivní uživatel:24.3.2020 20:25

Díky, vůbec mi nedošlo, že i když je ta funkce v aktivitě, tak je vlastně volaná z jiného vlákna.

Nahoru Odpovědět
24.3.2020 20:25
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.