Search code examples
androidversioncompatibility

facebook sdk coded for android 2.2 not working on android 4.0.4,showing an error android.os.Networkonmainthread


Hi i'm working on facebook api. i have gone through facebook documentation and coded as instructed in it.The below code is working fine in android 2.1-3.2,But while running in android 4.0.4 its giving an error android.os.networkonmainthread. I'm not getting any idea how to write below code using AsynckTask or threads(Painless thread).Please anyone here Suggest me how to code so that it can execute on all versiosn of android.Here is my code.

public class Facebook4 extends Activity {

    public static final String mAPP_ID = "222299217893177";

    public  Facebook mFacebook = new Facebook(mAPP_ID);
    private static final String FACEBOOK_PERMISSION = "publish_stream";
    private SharedPreferences mPrefs;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_facebook4);
        ((ImageView)findViewById(R.id.facebookLogin)).setOnClickListener( loginButtonListener );
        SessionStore.restore(mFacebook, this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mFacebook.authorizeCallback(requestCode, resultCode, data);
    }

    private OnClickListener loginButtonListener = new OnClickListener() {
        public void onClick( View v ) {
            if( !mFacebook.isSessionValid() ) {
                Toast.makeText(Facebook4.this, "Authorizing", Toast.LENGTH_SHORT).show();
                mFacebook.authorize(Facebook4.this, new String[] {FACEBOOK_PERMISSION},Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener());
                //startActivity(new Intent(FacebookLogin.this,MainActivity.class));
            }
            else {
                Toast.makeText( Facebook4.this, "Has valid session", Toast.LENGTH_SHORT).show();
                try {
                    JSONObject json = Util.parseJson(mFacebook.request("me"));
                    String facebookID = json.getString("id");
                    String firstName = json.getString("first_name");
                    String lastName = json.getString("last_name");                  
                    Toast.makeText(Facebook4.this, "You already have a valid session, " + firstName + " " + lastName + ". No need to re-authorize.", Toast.LENGTH_SHORT).show();
            }
            catch( Exception error ) {
                Toast.makeText( Facebook4.this, error.toString(), Toast.LENGTH_SHORT).show();
                }
            }
        //startActivity(new Intent(FacebookLogin.this,MainActivity.class));
        }
    };

    public final class LoginDialogListener implements DialogListener {
        public void onComplete(Bundle values) {
        try {
        //The user has logged in, so now you can query and use their Facebook info
        JSONObject json = Util.parseJson(mFacebook.request("me"));
        Log.i("id",  json.getString("id"));
        Log.i("FirstName", json.getString("first_name"));
        Log.i("lastname", json.getString("last_name"));
        Log.i("email", json.getString("email"));
        Log.i("Name", json.getString("name"));
        Log.i("gender",json.getString("gender"));

        SessionStore.save(mFacebook, Facebook4.this);

        }
        catch( Exception error ) {
        Toast.makeText( Facebook4.this, error.toString(), Toast.LENGTH_SHORT).show();
        Log.i("error", error.toString());
        }
        }

        public void onFacebookError(FacebookError error) {
            Toast.makeText( Facebook4.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show();
            }
            public void onError(DialogError error) {
            Toast.makeText( Facebook4.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show();
            }
            public void onCancel() {
            Toast.makeText( Facebook4.this, "Something went wrong. Please try again.", Toast.LENGTH_LONG).show();
            }
    }   

Solution

  • You are getting this error because you're doing a network operation, like accessing Facebook on your main UI Thread.

    To fix it in the best way, move all network related code into a separate Thread or AsyncTask