getting NetworkOnMainThreadException while integrating twitter API in android

坚强是说给别人听的谎言 提交于 2019-12-10 16:24:52

问题


I have searched a lot on it but not able to find a solution. I am trying to integrate twitter in my Android app. It works fine on emulator but does not go well on honeycomb and higher devices. Below, I have attached the log cat error with code.

01-14 11:56:31.226: W/System.err(3649): android.os.NetworkOnMainThreadException
01-14 11:56:31.230: W/System.err(3649):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:45)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:178)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:75)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:103)
01-14 11:56:31.238: W/System.err(3649):     at twitter4j.Twitter.getAccountSettings(Twitter.java:1440)
01-14 11:56:31.238: W/System.err(3649):     at com.recipe.pack.TwitterUtils.isAuthenticated(TwitterUtils.java:23)
01-14 11:56:31.238: W/System.err(3649):     at com.recipe.pack.RecpieActivity.onClick(RecpieActivity.java:763)
01-14 11:56:31.238: W/System.err(3649):     at android.view.View.performClick(View.java:3511)
01-14 11:56:31.238: W/System.err(3649):     at android.view.View$PerformClick.run(View.java:14105)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Handler.handleCallback(Handler.java:605)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Looper.loop(Looper.java:137)
01-14 11:56:31.242: W/System.err(3649):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-14 11:56:31.242: W/System.err(3649):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 11:56:31.242: W/System.err(3649):     at java.lang.reflect.Method.invoke(Method.java:511)
01-14 11:56:31.242: W/System.err(3649):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-14 11:56:31.242: W/System.err(3649):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-14 11:56:31.246: W/System.err(3649):     at dalvik.system.NativeStart.main(Native Method)

TwitterUtils.java

public static boolean isAuthenticated(SharedPreferences prefs) {

        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

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

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

    public static void sendTweet(SharedPreferences prefs,String msg) throws Exception {
        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

        AccessToken a = new AccessToken(token,secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);
        twitter.updateStatus(msg);
    }

class where button is implemented:

case R.id.btweet:
            Toast.makeText(this, "Recipe Tweet will be posted on your profile", 5000).show();
            try{
            if (TwitterUtils.isAuthenticated(prefs)) {
                sendTweet();
            } else {
                Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                i.putExtra("tweet_msg",getTweetMsg());
                startActivity(i);
            }
            }catch(Exception e){
                e.printStackTrace();
            }
            break;

回答1:


Try this:

Replace this code:

if (TwitterUtils.isAuthenticated(prefs)) {

With the following:

    new AsyncTask<SharedPreferences,Object, Boolean>() {

        @Override
        protected Boolean doInBackground(SharedPreferences... params) {
            return TwitterUtils.isAuthenticated(params[0]);
        }

        @Override
        protected void onPostExecute(Boolean isAuthenticated) {
            if (isAuthenticated) {
                // Do processing after successful authentication
                    sendTweet();
            }
            else {
                // Do processing after authentication failure
                    Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                    i.putExtra("tweet_msg",getTweetMsg());
                    startActivity(i);
            }
        }
    }.execute(prefs);



回答2:


You can't use Network actions on main thread, you've got to implement an AsyncTask which does the network actions on its doInBackground method.

Try this on your button:

Toast.makeText(this, "Recipe Tweet will be posted on your profile", 5000).show();
            try{
            if (TwitterUtils.isAuthenticated(prefs)) {
                new AsyncTask<Void,Void,Void>(){

                    protected Void doInBackground(Void... args){
                        sendTweet();
                        return null;
                    }

                }.execute();
            } else {
                Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                i.putExtra("tweet_msg",getTweetMsg());
                startActivity(i);
            }
            }catch(Exception e){
                e.printStackTrace();
            }
            break;



回答3:


write these lines and in oncreate and it will not give you exception

//-----------------Checking thread policy
    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT >= 10) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }          


来源:https://stackoverflow.com/questions/14316941/getting-networkonmainthreadexception-while-integrating-twitter-api-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!