2016-10-10 1 views
1

Ich habe ProgressBar in meiner Aktivität, und es dreht sich die ganze Zeit. Ich versuche zu avaliable Web-Seite zu verbinden - verwende ich InputInputStream "lags/stuns" App für eine Weile

InputStream input = new URL(url).openStream();

auf meine gewünschte URL zu bekommen. Es funktioniert gut. Abgesehen von einer Situation: wenn es beginnt zu laden, und ich die Internetverbindung während des Ladens/Verarbeitens abschalten (was nicht einfach in der Zeit ausgeschaltet werden kann, aber auch nicht schwer), hört die Progressbar auf sich zu drehen, weil App so etwas ist "eingefroren". Sie können es also nicht mit der Zurück-Taste beenden. Nach ein paar Sekunden, wie 3-4, dreht sich die ProgressBar erneut und die App ist unfrei und voll funktionsfähig. LogCat druckt nur, dass die App viele Frames übersprungen hat.

Code:

new Thread(new Runnable() 
{ 
     public void run() 
     { 
      try 
      { 
       InputStream input = new URL(url).openStream(); 
       ... 

      } catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
}).start(); 

Edit: I Jsoup bin mit empfangenen Webseite zu lesen. Also habe ich versucht

Jsoup.connect(url).get();

auch, aber gleiche Problem wie oben ...

LogCat:

Übersprungene 614 Frames!

Log2

10-14 17:25:16.365 26460-26460 D/libEGL: loaded /system/lib/egl/libEGL_mali.so 
10-14 17:25:16.375 26460-26460 D/libEGL: loaded /system/lib/egl/libGLESv1_CM_mali.so 
10-14 17:25:16.375 26460-26460 D/libEGL: loaded /system/lib/egl/libGLESv2_mali.so 
10-14 17:25:16.395 26460-26460 D/OpenGLRenderer: Enabling debug mode 0 
10-14 17:25:27.406 26460-26460 I/Choreographer: Skipped 603 frames! The application may be doing too much work on its main thread. 
+0

Sie benötigen einen Lese Timeout einstellen und den 'SocketTimeoutException' zu behandeln, die entsteht, wenn es auslöst. Es gibt keine andere Möglichkeit für Code, der nur aus einem Socket liest, um einen Kabelzug zu erkennen. – EJP

+0

In den meisten Fällen passiert es diese Ausnahme (und es ist alles gut, kein Einfrieren), aber manchmal passiert es einfach nicht, und nichts ist gedruckt (außer Nachricht überspringen Frames). Überprüfen Sie ein anderes Protokoll, das ich im Hauptpost hinzugefügt habe, es ist das, wo es den Ausnahmeblock nicht passiert hat (prüfen Sie die Zeitlücke in Sekunden - das ist das Einfrieren). Übrigens, wie stelle ich Timeout für InputStream ein? Es ist nur für Socket AFAIK möglich. Sollte ich Sockets anstelle von InputStream verwenden? Vielen Dank. – BlackJack

+0

Ich weiß nicht, was Sie mit "diese Ausnahme passieren" oder in der Tat, aber wenn Sie es nicht getrennt fangen, können Sie nicht separat damit umgehen. – EJP

Antwort

-1

Meiner Meinung nach ist eine schlechte Praxis Threads in Java laichen. Vor allem in Android. Es gibt Threadpools, die besser damit umgehen.

In Ihrem Fall Gebrauch AsyncTask:

AsyncTask.execute(new Runnable() { 
    @Override 
    public void run() { 
     try 
     { 
      InputStream input = new URL(url).openStream(); 
      ... 

     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

versucht, aber immer noch friert manchmal. – BlackJack

+0

Ihre Meinung ist keine Antwort und Sie haben die eigentliche Frage nicht beantwortet. – EJP

Verwandte Themen