У меня есть 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.
Вам необходимо установить тайм-аут для чтения и обработки 'SocketTimeoutException', которая возникает при срабатывании. Нет другого способа для кода, который просто считывается из сокета, чтобы обнаружить натяжение кабеля. – EJP
В большинстве случаев он проходит через это исключение (и все это хорошо, без зависания), но иногда он просто не проходит, и ничего не печатает (кроме сообщения о пропущенных кадрах). Проверьте другой журнал, который я добавил в основном сообщении, это тот, где он не прошел блок исключений (проверьте промежуток времени в секундах - это замораживание). Кстати, как установить тайм-аут для InputStream? Это возможно для Socket только AFAIK. Должен ли я использовать сокеты вместо InputStream? Благодарю. – BlackJack
Я не знаю, что вы подразумеваете под словом «пройти через это исключение» или даже любым из них, но если вы не поймаете его отдельно, вы не сможете обрабатывать его отдельно. – EJP