[英]Scribe-java and async request in 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
这是因为更高版本的Android现在要求网络连接不在主线程上进行。 我以前使用过AsyncTask,但是在以后的Android版本中已弃用它。
如果需要返回结果并更新UI,我建议使用AsyncTaskLoader 。 否则,您可以使用IntentService (或任何其他Service类型)。 您也可以直接创建一个新线程 。 无论您做出什么决定,一旦将连接从主线程上移开,就不会再收到NetworkOnMainThreadException了!
在@Jabari的答案之后,我还要添加我的答案。
是的,网络连接必须具有与UI线程不同的线程。
因此,我发现loopj的库非常好。
您可以从这里获得: http : //loopj.com/android-async-http/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.