2013-03-18 107 views
2

我正在尝试将我的应用程序与Twitter集成。但是我收到了一些错误。我使用this site的代码。我为我的应用程序创建了一个API。我已将网站的网址设置为http://www.androidhive.info,并将回调网址设置为http://androidhive.info。我更新了消费者和消费者的关键秘密。将Twitter与我的Android应用程序集成

我不知道为什么我得到这个错误。我在这里附加了错误logcat:

03-18 21:36:13.971: E/AndroidRuntime(1339): FATAL EXCEPTION: main 
03-18 21:36:13.971: E/AndroidRuntime(1339): android.os.NetworkOnMainThreadException 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:158) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:121) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at com.androidhive.twitterconnect.MainActivity.loginToTwitter(MainActivity.java:236) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at com.androidhive.twitterconnect.MainActivity.access$1(MainActivity.java:223) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at com.androidhive.twitterconnect.MainActivity$1.onClick(MainActivity.java:123) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.view.View.performClick(View.java:3480) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.view.View$PerformClick.run(View.java:13983) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.os.Handler.handleCallback(Handler.java:605) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.os.Looper.loop(Looper.java:137) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-18 21:36:13.971: E/AndroidRuntime(1339):  at dalvik.system.NativeStart.main(Native Method) 

回答

0

在主线程上执行网络操作是一种不好的做法,这就是为什么您会看到这一点。这是政策阻止的。 如果你真的必须为测试做了,把你的OnCreate如下:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 

请记住这是非常不好的做法,以做到这一点,最好应该将你的网络代码到AsyncTaskThread

+0

请问您可以发布使用Twitter API的好做法... – Developer 2013-03-18 16:05:03

+0

任何人都可以发布代码纠正,因为我没有任何使用twitter,facebook ..... api的经验。 – Developer 2013-03-18 16:35:15

+0

如果你只是想让它快速工作,请将我上面的答案中的两行复制到主要活动的onCreate()方法中,但请仔细阅读为什么它不好。 – tristan2468 2013-03-18 16:47:53

0

您应该将试图使用Twitter API(或执行任何其他网络操作)的代码移动到新的AsyncTask或新的Thread

3

android.os.NetworkOnMainThreadException

从Android 3.0的,你不能试图从主(UI)线程进行联网操作。所以你必须将你的代码移动到后台线程,最好的解决方案是使用AsyncTask来达到你的目标。

它被指定为您的任务。通常在UI线程上做一些长时间的计算,网络和其他工作也是一种不好的做法。您应该让Activity类清理干净,并将应用程序的逻辑与外观分开。的AsyncTask的

主要优点:它的通用型(安全),提供了一些方法,如果你想宣布“什么改变”​​的用户和实施是不难理解的。

如果你想要一些灵感看看Zwitscher's github