Scribe-java и асинхронный запрос в Android 4

В моем эмуляторе Android 4.2.2 я пытаюсь использовать фрагмент кода писца:

OAuthService service = new ServiceBuilder()
            .provider(TwitterApi.class)
            .apiKey("abc")
            .apiSecret("aaa123")
            .debug()
            .build();
    Scanner in = new Scanner(System.in);
    Token requestToken = service.getRequestToken();

В logcat я получаю следующую ошибку. Я думаю, это может быть из-за того, что этот пример кода Scribe не является асинхронной задачей. Можете ли вы порекомендовать асинхронный пример, пожалуйста?

Обратите внимание, что этот фрагмент кода работает в Android 2.3.3. Это не работает в Android 4.2.2.

    E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: 
      Unable to start activity  
      ComponentInfo{com.myexample.android/com.myexample.android.MyActivity}: 
      org.scribe.exceptions.OAuthConnectionException:
      There was a problem while creating a connection to the remote service.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5039)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: org.scribe.exceptions.OAuthConnectionException: There was a problem while creating a connection to the remote service.
    at org.scribe.model.Request.send(Request.java:70)
    at org.scribe.oauth.OAuth10aServiceImpl.getRequestToken(OAuth10aServiceImpl.java:59)
    at org.scribe.oauth.OAuth10aServiceImpl.getRequestToken(OAuth10aServiceImpl.java:40)
    at org.scribe.oauth.OAuth10aServiceImpl.getRequestToken(OAuth10aServiceImpl.java:45)
    at com.myexample.android.MyActivity.onCreate(MyActivity.java:139)
    at android.app.Activity.performCreate(Activity.java:5104)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    ... 11 more
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    at java.net.InetAddress.getAllByName(InetAddress.java:214)
    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
    at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
    at org.scribe.model.Request.addBody(Request.java:136)
    at org.scribe.model.Request.doSend(Request.java:114)
    at org.scribe.model.Request.send(Request.java:66)
    ... 18 more

person trante    schedule 25.07.2013    source источник


Ответы (2)


Это связано с тем, что более поздние версии Android теперь требуют, чтобы сетевые подключения происходили вне основного потока. Раньше я использовал для этого AsyncTask, но в будущей версии Android он устарел.

Я предлагаю использовать AsyncTaskLoader, если вам нужно получить результат и обновить пользовательский интерфейс. В противном случае вы можете использовать IntentService (или любой другой Тип службы). Вы также можете напрямую создать новый тред. Что бы вы ни решили, как только вы отключите соединение от основного потока, вы не получите NetworkOnMainThreadException больше нет!

person Jabari    schedule 19.12.2013

После ответа @Jabari я также добавляю свой ответ.

Да, сетевое соединение должно иметь поток, отличный от потока пользовательского интерфейса.
Итак, я обнаружил, что библиотека loopj очень хороша.
Вы можете получить отсюда: http://loopj.com/android-async-http/

person trante    schedule 19.12.2013