C# týden Slevový týden - Březen
Využij náš slevový týden a získej až 30 % bodů navíc zdarma! Zároveň také probíhá C# týden se slevou na e-learning až 80 %
Hledáme fulltime programátora do ITnetwork týmu -100% homeoffice, 100% časově flexibilní #bezdeadlinu Mám zájem!
Avatar
Jenkings
Redaktor
Avatar
Jenkings:24. marca 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.

Odpovedať
24. marca 14:14
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Odpovedá na Jenkings
Martin Donát:24. marca 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é riešenie
+20 Skúseností
+1 bodov
Riešenie problému
 
Hore Odpovedať
24. marca 15:22
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Jenkings
Redaktor
Avatar
Odpovedá na Martin Donát
Jenkings:24. marca 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.

Hore Odpovedať
24. marca 20:25
Největší časovou náročnost má výpočet časové náročnosti..
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 3 správy z 3.