使用twitter4j库的Twitter Android登录错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用twitter4j库的Twitter Android登录错误相关的知识,希望对你有一定的参考价值。

我正在尝试使用Twitter4j库登录我的Twitter应用程序。但每当我点击我的登录按钮时,我的应用程序就会崩溃。

这是我班上的方法 -

    btnLoginTwitter.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Call login twitter function
            loginToTwitter();
        }
    });


/**
 * Function to login twitter
 * */
private void loginToTwitter() {
    // Check if already logged in
    if (!isTwitterLoggedInAlready()) {
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
        builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
        Configuration configuration = builder.build();

        TwitterFactory factory = new TwitterFactory(configuration);
        twitter = factory.getInstance();

        try {
            requestToken = twitter
                    .getOAuthRequestToken(TWITTER_CALLBACK_URL);
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                    .parse(requestToken.getAuthenticationURL())));
        } catch (TwitterException e) {
            e.printStackTrace();
        }
    } else {
        // user already logged into twitter
        Toast.makeText(getApplicationContext(),
                "Already Logged into twitter", Toast.LENGTH_LONG).show();
    }
}

当我按下登录按钮时,它显示以下LogCat -

07-18 00:55:00.726: E/androidRuntime(1185): FATAL EXCEPTION: main
07-18 00:55:00.726: E/AndroidRuntime(1185): android.os.NetworkOnMainThreadException
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:158)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:121)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at com.androidhive.twitterconnect.MainActivity.loginToTwitter(MainActivity.java:236)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at com.androidhive.twitterconnect.MainActivity.access$1(MainActivity.java:223)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at com.androidhive.twitterconnect.MainActivity$1.onClick(MainActivity.java:123)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.view.View.performClick(View.java:4240)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.view.View$PerformClick.run(View.java:17721)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.os.Handler.handleCallback(Handler.java:730)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.os.Looper.loop(Looper.java:137)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at android.app.ActivityThread.main(ActivityThread.java:5103)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at java.lang.reflect.Method.invokeNative(Native Method)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at java.lang.reflect.Method.invoke(Method.java:525)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-18 00:55:00.726: E/AndroidRuntime(1185):     at dalvik.system.NativeStart.main(Native Method)
答案

'android.os.NetworkOnMainThreadException'意味着你正在执行网络相关的功能,如Http post,get等等你的主GUI线程..所有你要做的就是把这个东西放在AsyncTask

这样做:

private void loginToTwitter() 
{
new AsyncTask<Void, Void, Boolean>() {
@Override
protected void onPreExecute() {
                super.onPreExecute();
}

@Override
protected Boolean doInBackground(Void... params) {
if (!isTwitterLoggedInAlready()) {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
Configuration configuration = builder.build();

TwitterFactory factory = new TwitterFactory(configuration);
twitter = factory.getInstance();

try {
requestToken = twitter
             .getOAuthRequestToken(TWITTER_CALLBACK_URL);
return true;
} catch (TwitterException e) {
e.printStackTrace();
}
} else {
return false;
}
}

@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);

if(result)
{
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                    .parse(requestToken.getAuthenticationURL())));
}else{
Toast.makeText(getApplicationContext(),
                "Already Logged into twitter", Toast.LENGTH_LONG).show();}
}
}.execute();
}

注意:您无法从doInBackgroung()访问GUI线程,您可以从preExecutepostExecute方法访问GUI线程

另一答案

您正在应用程序的主线程中执行耗时的任务。这就是为什么它给android.os.NetworkOnMainThreadException错误。

尝试通过实现doInBackground()将代码放在AsyncTask方法中,如下所示:

private class WSCalling extends AsyncTask<Void, Void, Integer> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected  Integer doInBackground(Void... params) {
         if (!isTwitterLoggedInAlready()) {
     ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
    builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
    Configuration configuration = builder.build();

    TwitterFactory factory = new TwitterFactory(configuration);
    twitter = factory.getInstance();

    try {
        requestToken = twitter
                .getOAuthRequestToken(TWITTER_CALLBACK_URL);

    } catch (TwitterException e) {
        e.printStackTrace();
      }
  } 
        return requestToken;
    }

    @Override
    protected void onPostExecute(Integer args) {
           if(args != null)
         {
        this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                .parse(args.getAuthenticationURL())));
        }else {
    // user already logged into twitter
    Toast.makeText(getApplicationContext(),
            "Already Logged into twitter", Toast.LENGTH_LONG).show();
   }
    }
}

以上是关于使用twitter4j库的Twitter Android登录错误的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何选项可以使用 twitter4j 获得超过 10 个 twitter 热门话题?

过滤 twitter4j 流

Twitter4j,我如何注销?

使用 twitter4J 登录 android 后关闭浏览器窗口

Twitter4J + Android:身份验证挑战为空异常

使用twitter4j在运行时添加位置过滤器