1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

UDP Listener

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von jowieweb, 09.03.2012.

  1. jowieweb, 09.03.2012 #1
    jowieweb

    jowieweb Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    06.02.2012
    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.
     
  2. DieGoldeneMitte, 09.03.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Zwei Fragen stellen sich:

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

    • Wieviele dieser Threads startest du denn so?
     
    jowieweb bedankt sich.
  3. jowieweb, 09.03.2012 #3
    jowieweb

    jowieweb Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    06.02.2012
    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...
     
  4. DieGoldeneMitte, 10.03.2012 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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
     
  5. jowieweb, 10.03.2012 #5
    jowieweb

    jowieweb Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    06.02.2012
    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: 10.03.2012
  6. DieGoldeneMitte, 10.03.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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.
     
  7. Fr4gg0r, 10.03.2012 #7
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Das will mir nicht einleuchten..
     
  8. DieGoldeneMitte, 12.03.2012 #8
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Das war eher ein Versuch, jemandem ein überflüssiges Singleton auszureden :D
     

Diese Seite empfehlen