UDP Listener

J

jowieweb

Neues Mitglied
0
Hallo,
ich hab da ein kleines Problem mit meinem udp "listener"...
Er läuft zwar, verbraucht aber sehr viel Akku (10 % in 1h).
Leider weiß ich nicht warum...

Code:
public class reader implements Runnable {
    private static byte[] message = new byte[2048];
    private static DatagramSocket s = null;
    private static DatagramPacket p = new DatagramPacket(message, message.length);
    @Override
    public void run() {
        read();
    }
    private static void read()
    {        
        try {
            s = new DatagramSocket(5005);
            int server_port = 5005;
                s.receive(p);

                final String text = new String(message, 0, p.getLength());

                Log.d("UDP", "message:" + text);
                try {
                    while(s.isClosed() == false)
                    {
                        s.close();                         
                        Thread.sleep(100);
                    }

                } catch (Exception e) {
                    Log.d("exception", e.getMessage());
                }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        } catch (Exception e) {
            Log.d("exception", e.toString());
        }
     
    }
}
gestartet wird der Thread mit
Code:
Thread reader1 = new Thread(new reader());
reader1.start();
Wenn ich den Thread nicht start ist der Strom verbrauch absolut normal.
Ich hoffe, dass mir wer helfen kann.
 
Zwei Fragen stellen sich:

  • Kommt dein thread denn am ende von run() an?

  • Wieviele dieser Threads startest du denn so?
 
  • Danke
Reaktionen: jowieweb
Hi,
also ich starte genau einen Thread. Normalerweise hängt der halt in ner Whileschleife und ließt weiter... Allerdings ist mir da aufgefallen, dass der Thread sehr viel Akku zieht, also hab ich einfach mal alles auf das hier angegebene runter kommentiert. Leider zeigte das keine Änderrung.

Und ja, der kommt am Ende an.
Wenn ich mir s mit nem breakpoint in der While zum Closen angucke zeigt mir Eclise:

"s=DatagramSocket
adress = null
impl: PlainDatagrammSocketImpl
isBound = true
isClosed = false
isConnected = false
lock = DatagramSocket$Lock
port = -1"
an.
Dann wird "s" geschlossen und der Thread kommt zum Ende...
 
Also, dass er in der whileschleife viel Akku zieht, das leuchtet mir ja im Prinzip ein - das ist ja busy polling, was du da machst (alle 0,1sec Thread aufwachen lassen), aber die Schleife sollte ja eigentlich nicht allzuoft durchlaufen werden. Du machst den port zu und wartest, bis das System das akzeptiert. (Eigentlich komisch, dass da überhaupt eine Schleife nötig ist. :bored:)

Aber wenn der Thread beendet ist, sollte ja nichts mehr laufen. Es sei denn, du verheimlichst uns noch etwas :D
 
DieGoldeneMitte schrieb:
(Eigentlich komisch, dass da überhaupt eine Schleife nötig ist. :bored:)

Die Schleife wird nur einmal durchlaufen... Ich wollte aber sicherstellen das es wirklich dicht ist ^^

Und nein, ich verschweige hier eig. nix :D
Wenn ich den Thread so starte verbrauchts halt SEHR viel Akku und ich würds gerne ändern ;)



edit:
so habs hinbekommen. Scheinbar ziehts auch Akku wenn man munter weiter Packete auf den Port sendet, auch wenn das Socket dicht ist...
2 pro Sekunde war da dann wohl etwas viel...
 
Zuletzt bearbeitet:
Alles sehr merkwürdig. Ich kenne mich jetzt mit UDP ncht soo gut aus, aber mir fällt noch auf, dass du die Felder (s und p) static gemacht hast, dann kann das Memorymanagement die nicht aufräumen.

Kannst mal gucken, ob das Verhalten besser ist, wenn sie nicht static sind.
 
Das will mir nicht einleuchten..
 
Das war eher ein Versuch, jemandem ein überflüssiges Singleton auszureden :D
 

Ähnliche Themen

M
  • maksimilian
Antworten
2
Aufrufe
1.198
maksimilian
M
Jansenwilson
Antworten
1
Aufrufe
675
Mazuch
Mazuch
A
Antworten
10
Aufrufe
1.005
swa00
swa00
Zurück
Oben Unten