2013-03-18 5 views
2

Я пытаюсь интегрировать свое приложение с Twitter. Но я получаю некоторые ошибки. Я использовал код от this site. Я создал API для своего приложения. Я установил URL-адрес веб-сайта http://www.androidhive.info, а URL-адрес обратного вызова - 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); 

Пожалуйста, помните, что это очень плохая практика, чтобы сделать это, и в идеале должны переместить код сети на AsyncTask или Thread.

+0

Не могли бы вы опубликовать хорошую практику использования twitter api ... – Developer

+0

может кто-нибудь опубликовать код с исправлением, потому что у меня нет опыта использования twitter, facebook ..... api. – Developer

+0

Если вы просто хотите, чтобы он быстро работал, скопируйте две строки в моем ответе выше на метод onCreate() основной активности, но, пожалуйста, прочитайте, почему это плохо. – tristan2468

0

Вы должны перенести свой код, который пытается использовать API Twitter (или выполнять любую другую сетевую операцию) либо на новый AsyncTask, либо на новый Thread.

3

android.os.NetworkOnMainThreadException

С Android 3.0 вы не можете попытаться выполнить сетевую операцию из главного (UI) тему. Таким образом, вам нужно переместить свой код в фоновый поток. Лучшим решением является использование AsyncTask для достижения вашей цели.

Он предназначен для задач, подобных вашим. Также, как правило, это плохая практика, чтобы сделать некоторые длинные вычисления, сетевые и другие материалы в потоке пользовательского интерфейса. Вы должны позволить своим классам активности очистить и отделить логику приложения от внешнего вида.

Основные преимущества AsyncTask: это универсальный тип (тип сейф), предлагает несколько методов, если вы хотите, чтобы объявить о том, что пользователь «что-то изменилось» и реализация не трудно понять.

Если вы хотите вдохновение посмотреть на Zwitscher's github.

Смежные вопросы