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 のこのサンプル コードが async-task ではないことが原因である可能性があると思います。非同期の例をお勧めできますか?

このコード スニペットは 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
4

2 に答える 2

5

これは、Android の新しいバージョンでは、ネットワーク接続がメイン スレッドから離れて発生する必要があるためです。以前はこれに AsyncTask を使用していましたが、Android の将来のバージョンでは廃止される予定です。

結果を受け取り、UI を更新する必要がある場合は、 AsyncTaskLoaderを使用することをお勧めします。それ以外の場合は、IntentService (またはその他のサービスタイプ) を使用できます。新しいスレッドを直接作成することもできます。どのような決定を下したとしても、接続をメイン スレッドから切り離すと、NetworkOnMainThreadExceptionを受け取ることはなくなります。

于 2013-12-19T07:48:04.033 に答える
1

@Jabariの回答の後に、回答も追加します。

はい、ネットワーク接続には UI スレッドとは異なるスレッドが必要です。
それで、loopj のライブラリが非常に優れていることがわかりました。
これから取得できます:http://loopj.com/android-async-http/

于 2013-12-19T09:50:56.400 に答える