IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Aktivity
Avatar
Jenkings
Tvůrce
Avatar
Jenkings: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
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovídá na Jenkings
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
Jenkings
Tvůrce
Avatar
Odpovídá na Martin Donát
Jenkings: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
Největší časovou náročnost má výpočet časové náročnosti..
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.