Witam. Pisza pewną aplikacje na platformę Android.
Informacje ogolne:
Aplikacja łączy się z serwerem za pomocą socketów. Posiada klase Polaczenie (rozszerzającą service), która jest odpowiedzialna za utrzymanie połączenia. Aplikacja w pewnym momencie musi zacząć nasłuchiwać informacji z serwera nie blokując przy tym komunikacji. Moim pomysłem było stworzenie osobnego wątku w tej usłudze. Poniżej kod klasy takiego wątku która startuje w odpowiednim miejscu klasy Polaczenie.
class Nasluch extends Polaczenie implements Runnable {
ObjectInputStream in = null;
public Nasluch(ObjectInputStream in) {
this.in = in;
}
public void run() {
boolean test;
System.out.println("Nasluch rozpoczety");
while(true){
try {
Object o = (Object) in.readObject();
if(((MsgPack)o).czyZgloszenie){
System.out.println("Przyszło zgłoszenie");
test = true;
try {
Intent intent = new Intent();
intent.setAction("test");
intent.putExtra("test", test);
sendBroadcast( intent );
} catch (Exception e) {
System.out.println("nie wyslalem komunikatu z servicu");
}
}
break;
} catch (Exception e) {
e.printStackTrace();
System.out.println("Nie moge zlapac obiektu zdarzenia");
}
}
}
}
W pierwszej kolejności implementowałem do niej tylko interfejs Runnable, jednak w późniejszym czasie zostałem zmuszony (a właściwie pchnięty desperacją) do tego aby klasa ta rozszerzała moją klase Polaczenie.
Ogólnie sam wątek działa bez większych zarzutów. Problem pojawia się gdy chce wysłać informację o fakcie pojawienia się zdarzenia do mojej aktywności.
Jeśli się przyda to ta część aktywności odpowiedzialna za "łapanie":
w onCreate:
LocalBroadcastManager.getInstance(this).registerReceiver(
mMessageReceiver, new IntentFilter("test"));
Sam mMessageReceiver:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
boolean test = intent.getBooleanExtra("test", false);
if(test){
Toast.makeText(getBaseContext(), "Jest zgloszenie", Toast.LENGTH_LONG).show();
}
}
};
Na konsole mam wyrzucany komunikat "nie wyslalem komunikatu z servicu".
Czy ktoś mógłby mnie nakierować na to gdzie robię błąd?