1

アプリケーションでtwitter4jを使用しています。以下のコードを使用して、認証トークンの有効期限が切れているか、ユーザーがまだログインしていないかを確認しています

public static boolean isAuthenticated(Context context) {

        TwitterPrefrences twitterPref = new TwitterPrefrences(context);     
        String token = twitterPref.getTwitterAuthToken();
        String secret = twitterPref.getTwitterAuthTokenSecrate();

        AccessToken a = new AccessToken(token,secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(Constants.TWITT_CONSUMER_KEY, Constants.TWITT_CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);

        try {
            twitter.getAccountSettings();
            return true;
        } catch (TwitterException e) {
            return false;
        }

    }

しかし、私は次のエラーが発生しています

 05-02 19:52:23.531: E/AndroidRuntime(1441): FATAL EXCEPTION: main
    05-02 19:52:23.531: E/AndroidRuntime(1441): android.os.NetworkOnMainThreadException
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:45)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:178)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:75)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:103)
    05-02 19:52:23.531: E/AndroidRuntime(1441):     at 

twitter4j.Twitter.getAccountSettings(Twitter.java:1440)

発信者コード

chbTwOption.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked) {
                    boolean showTwlogin = false;
                    if ("No".equalsIgnoreCase(twitPref.getTwitterAuthToken())
                            || "No".equalsIgnoreCase(twitPref.getTwitterAuthTokenSecrate())) {
                        showTwlogin = true;
                    } else {                        
                        showTwlogin = TwitterUtils.isAuthenticated(AddSchedule.this);
                    }   

                    if(showTwlogin) {
                        showSocialMediaLoginMessage(Constants.TW_LOGIN_MESSAGE);
                    }
                }
            }
        });

実装する必要があることは明らかですAsyncTasktwitter.getAccountSettings() 、メソッドとして結果を取得するにはどうすればよいAsyncTaskですか?認証トークンの有効期限を確認する他の方法はありますか?AsyncTaskまたは、使用したとおりの結果を返すメソッドとして実装するにはどうすればよいですかisAuthenticated()

案内してください。

ありがとうございました。

4

2 に答える 2

1

Zwitscherのソース、 特にTwitterLoginActivityをご覧ください。

于 2012-05-02T14:57:00.847 に答える
0

このエラーは、おそらく4.0デバイスで発生するか、http接続の応答に時間がかかりすぎる場合に発生する可能性があります。

asynctaskを知らない場合、簡単な解決策は次のようになります

 public static boolean isAuthenticated(Context context) {
        new Thread() {
        @Override 
        public void run() {
        TwitterPrefrences twitterPref = new TwitterPrefrences(context);     
        String token = twitterPref.getTwitterAuthToken();
        String secret = twitterPref.getTwitterAuthTokenSecrate();

        AccessToken a = new AccessToken(token,secret);
        Twitter twitter = new TwitterFactory().getInstance();
             twitter.setOAuthConsumer(Constants.TWITT_CONSUMER_KEY,Constants.TWITT_CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);

        try {
            twitter.getAccountSettings();
            return true;
        } catch (TwitterException e) {
            return false;
        }
      }
     }.start();

    }

しかし、より良い方法はasynctaskを実装することです。

ありがとうsanthu

于 2012-05-02T15:09:32.827 に答える