2016-10-10 8 views
1

У меня есть ProgressBar в моей деятельности, и он постоянно вращается. Я пытаюсь подключиться к Имеющийся веб-страницы - Я использую InputStreamПриложение InputStream "lags/stuns" на некоторое время

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

, чтобы получить нужный мне адрес. Он работает нормально. За исключением одной ситуации: когда она начинает загружаться, и я выключаю подключение к Интернету, пока это загрузка/обработка (что не так просто отключить в нужное время, но также и не сложно), Progressbar перестает вращаться, потому что приложение - это что-то вроде «заморожен». Поэтому вы не можете даже выйти из нее с помощью кнопки «Назад». Через несколько секунд, например, 3-4, ProgressBar снова вращается, а приложение размораживается и полностью работает. LogCat только печатает, что приложение пропустило много кадров.

Код:

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

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

Edit: Я использую Jsoup читать полученную веб-страницу. Так что я попытался

Jsoup.connect(url).get();

тоже, но та же проблема, что и выше ...

LogCat:

Пропущено 614 кадров!

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

Вам необходимо установить тайм-аут для чтения и обработки 'SocketTimeoutException', которая возникает при срабатывании. Нет другого способа для кода, который просто считывается из сокета, чтобы обнаружить натяжение кабеля. – EJP

+0

В большинстве случаев он проходит через это исключение (и все это хорошо, без зависания), но иногда он просто не проходит, и ничего не печатает (кроме сообщения о пропущенных кадрах). Проверьте другой журнал, который я добавил в основном сообщении, это тот, где он не прошел блок исключений (проверьте промежуток времени в секундах - это замораживание). Кстати, как установить тайм-аут для InputStream? Это возможно для Socket только AFAIK. Должен ли я использовать сокеты вместо InputStream? Благодарю. – BlackJack

+0

Я не знаю, что вы подразумеваете под словом «пройти через это исключение» или даже любым из них, но если вы не поймаете его отдельно, вы не сможете обрабатывать его отдельно. – EJP

ответ

-1

На мой взгляд, это плохая практика, чтобы породить потоки в Java. Особенно в Android. Есть пулы потоков, которые справляются с этим лучше.

В вашем случае использования AsyncTask:

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

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

пытался, но иногда зависает. – BlackJack

+0

Ваше мнение не является ответом, и вы не рассматривали фактический вопрос. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^