F
Flocke123
Ambitioniertes Mitglied
- 4
Hallo,
stehe vor einem weiteren Problem und ich reis mir bald sämtliche Haare raus.
Ein Service startet einen AsyncTask, der in seiner doInBackground() Methode auf ein UDP Paket lauscht.
Wer die Eigenschaften der socket.receive() Methode kennt, sollte nun schon wissen, welche Problematik es mit sich zieht.
Diese Methode verhindert die Weiterverarbeitung des Codes.
Teil meines Services
Ziemlich simple. Drücke ich auf einen Button "Start", wird ein Neuer AsyncTask instanziert und das boolean "release" gesetzt. Drücke ich hingegen auf Stop, wird das boolean zurückgesetzt und soll somit den Task beendet. (was es auch tut, aber erst sobald ein weiteres Paket ankommt.
doInBackground
Das "if release == false dann break" ist ein Verzweiflungsakt, da ich ja weis, das diese Zeile nie bearbeitet wird, bis ein neues Paket eintrifft.
Ich gehe davon aus, dass schon viele Leute vor einer ähnlichen Problematik standen, und mir hierzu vllt einen Tipp geben können. Würde mich freuen.
Gruß Flo
stehe vor einem weiteren Problem und ich reis mir bald sämtliche Haare raus.
Ein Service startet einen AsyncTask, der in seiner doInBackground() Methode auf ein UDP Paket lauscht.
Wer die Eigenschaften der socket.receive() Methode kennt, sollte nun schon wissen, welche Problematik es mit sich zieht.
Diese Methode verhindert die Weiterverarbeitung des Codes.
Teil meines Services
Code:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getAction().equals("action.START")) {
Toast.makeText(getApplicationContext(), "OnStartCommand Equals Start", Toast.LENGTH_LONG).show();
release = true;
MyUdpListener listener = new MyUdpListener();
listener.execute();
} else if (intent.getAction().equals("action.STOP")) {
Toast.makeText(getApplicationContext(), "OnStartCommand Equals Stop", Toast.LENGTH_LONG).show();
release = false;
}
return super.onStartCommand(intent, flags, startId);
}
Ziemlich simple. Drücke ich auf einen Button "Start", wird ein Neuer AsyncTask instanziert und das boolean "release" gesetzt. Drücke ich hingegen auf Stop, wird das boolean zurückgesetzt und soll somit den Task beendet. (was es auch tut, aber erst sobald ein weiteres Paket ankommt.
doInBackground
Code:
@Override
protected String doInBackground(String... arg0) {
try {
if (socket == null) {
socket = new DatagramSocket(null);
SocketAddress socketAddr = new InetSocketAddress(2050);
socket.setReuseAddress(true);
socket.setBroadcast(true);
socket.bind(socketAddr);
}
} catch (SocketException e) {
e.printStackTrace();
}
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while(release) {
try {
Log.i("MyUdpListener", "listening...");
socket.receive(packet);
if (release == false) {
break;
}
String message = new String(packet.getData(), 0, packet.getLength());
publishProgress(message);
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
Das "if release == false dann break" ist ein Verzweiflungsakt, da ich ja weis, das diese Zeile nie bearbeitet wird, bis ein neues Paket eintrifft.
Ich gehe davon aus, dass schon viele Leute vor einer ähnlichen Problematik standen, und mir hierzu vllt einen Tipp geben können. Würde mich freuen.
Gruß Flo