2013-03-18 5 views
2

내 응용 프로그램을 트위터에 통합하려고합니다. 하지만 몇 가지 오류가 발생합니다. 나는 this site 코드를 사용했다. 내 앱용 API를 만들었습니다. 웹 사이트 URL을 http://www.androidhive.info으로 설정하고 콜백 URL을 http://androidhive.info으로 설정했습니다. 나는 소비자와 소비자 키 비밀을 갱신했다.내 안드로이드 응용 프로그램에 트위터를 통합

왜이 오류가 발생하는지 잘 모르겠습니다. 여기에 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

트위터 API를 사용하여 좋은 연습을 게시 할 수 있습니까? – Developer

+0

트위터, 페이스 북 ..... API를 사용하여 어떤 경험이 없기 때문에 누구든지 수정 코드를 게시 할 수 있습니다. – Developer

+0

그냥 빠르게 작동하게하려면 위의 대답에있는 두 줄을 주 활동의 onCreate() 메소드에 복사하십시오.하지만 왜 그렇게 잘못했는지 읽어보십시오. – tristan2468

0

Twitter API를 사용하거나 다른 네트워크 작업을 수행하려는 코드를 새 AsyncTask 또는 새 Thread으로 이동해야합니다.

3

android.os.NetworkOnMainThreadException는 홈페이지 (UI) 스레드에서 네트워크 작업을 수행 할 수 없습니다 안드로이드 3.0에서

. 따라서 코드를 백그라운드로 옮겨야합니다. 스레드와 최상의 솔루션은 목표를 달성하기 위해 AsyncTask을 사용하는 것입니다.

귀하의 작업으로 지정되었습니다. 또한 일반적으로 UI Thread에서 긴 계산, 네트워킹 및 기타 작업을 수행하는 것은 바람직하지 않습니다. 액티비티 클래스를 정리하고 응용 프로그램의 논리를 모양과 분리해야합니다. AsyncTask를의

주요 장점은 : 당신이 "뭔가 변경"한다는 사용자를 발표 할 경우 일반 유형 (유형 안전)이, 몇 가지 방법을 제공입니다 및 구현은 이해하기 어렵지 않다.

영감을 얻으려면 Zwitscher's github을 참조하십시오.

관련 문제