Сеть в пользовательском интерфейсе потока на устройстве Android (Android 3.0 или более поздней версии)

1

Мне нужно проанализировать HTML-код веб-сайта и показать некоторую информацию в моем приложении
Поэтому я попробовал JSoup для получения результата
Он отлично работает на эмуляторе, но в реальном устройстве он выйдет из строя; вот журнал:

05-25 21:42:20.935: D/AndroidRuntime(32230): Shutting down VM  
05-25 21:42:20.935: W/dalvikvm(32230): threadid=1: thread exiting with uncaught exception (group=0x401b9760)  
05-25 21:42:20.940: E/AndroidRuntime(32230): FATAL EXCEPTION: main
05-25 21:42:20.940: E/AndroidRuntime(32230): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abbasizadeh.Currency/com.abbasizadeh.Currency.CurrencyUpdatableActivity}: android.os.NetworkOnMainThreadException
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread.access$500(ActivityThread.java:122)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.os.Looper.loop(Looper.java:132)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread.main(ActivityThread.java:4123)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at java.lang.reflect.Method.invokeNative(Native Method)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at java.lang.reflect.Method.invoke(Method.java:491)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at dalvik.system.NativeStart.main(Native Method)
05-25 21:42:20.940: E/AndroidRuntime(32230): Caused by: android.os.NetworkOnMainThreadException
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at java.net.InetAddress.getAllByName(InetAddress.java:249)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:217)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:404)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:391)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:157)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:146)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at com.abbasizadeh.Currency.CurrencyUpdater.updateInfo(CurrencyUpdater.java:35)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at com.abbasizadeh.Currency.CurrencyUpdatableActivity.onCreate(CurrencyUpdatableActivity.java:20)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
05-25 21:42:20.940: E/AndroidRuntime(32230):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
05-25 21:42:20.940: E/AndroidRuntime(32230):    ... 11 more  

in CurrencyUpdatableActivity.java:20 Я называю CurrencyUpdater.java:35 и CurrencyUpdater.java:35:

Document document = Jsoup.connect(url).get();

благодарю вас за помощь в этом странном вопросе

Изменение: я добавил проблему версии для Android в свой заголовок для лучшего поиска других

Теги:
file
jsoup
networking

1 ответ

2
Лучший ответ

В Android 3.0 и новее вам запрещается касаться сети или файла ввода-вывода в потоке пользовательского интерфейса. Это хорошо, поскольку это заставляет вас не прерывать пользовательский интерфейс для операций, которые могут занять много времени. Посмотрите на эту строку в своем журнале:

05-25 21:42:20.940: E/AndroidRuntime(32230): Caused by: android.os.NetworkOnMainThreadException

Вы уже выяснили, где выбрано исключение, теперь вам нужно поместить этот код в метод doInBackground() для AsyncTask.

  • 0
    Большое вам спасибо. Вы сказали точную проблему: это из-за версии для Android.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню