“Calling this from your main thread can lead to deadlock and/or ANRs while getting accesToken” from GoogleAuthUtil(Google Plus integration in Android)

前端 未结 4 1583
南笙
南笙 2020-12-01 12:27

In my android application, I am trying to get AccessToken from GoogleAuthUtil as below :

accessToken = GoogleAuthUtil.getToken(this, mPlusClient.getAc

相关标签:
4条回答
  • 2020-12-01 13:06

    Use separate thread for your internet code. Error is telling that more time consuming process is running in the app and here that is internet. So use separate thread or Async task.

    Check out this link NetworkOnMainThreadException

    Hope it will help you.

    0 讨论(0)
  • 2020-12-01 13:13

    Try it with an AsyncTask like this:

            AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
                @Override
                protected String doInBackground(Void... params) {
                    String token = null;
    
                    try {
                        token = GoogleAuthUtil.getToken(
                                MainActivity.this,
                                mGoogleApiClient.getAccountName(),
                                "oauth2:" + SCOPES);
                    } catch (IOException transientEx) {
                        // Network or server error, try later
                        Log.e(TAG, transientEx.toString());
                    } catch (UserRecoverableAuthException e) {
                        // Recover (with e.getIntent())
                        Log.e(TAG, e.toString());
                        Intent recover = e.getIntent();
                        startActivityForResult(recover, REQUEST_CODE_TOKEN_AUTH);
                    } catch (GoogleAuthException authEx) {
                        // The call is not ever expected to succeed
                        // assuming you have already verified that 
                        // Google Play services is installed.
                        Log.e(TAG, authEx.toString());
                    }
    
                    return token;
                }
    
                @Override
                protected void onPostExecute(String token) {
                    Log.i(TAG, "Access token retrieved:" + token);
                }
    
            };
            task.execute();
    

    SCOPES is a space separated list of OAuth 2.0 scope strings. For example SCOPES could be defined as:

    public static final String SCOPES = "https://www.googleapis.com/auth/plus.login "
        + "https://www.googleapis.com/auth/drive.file";
    

    These represent the permissions that your app is requesting from the user. The scopes requested in this example are documented here:

    • https://developers.google.com/+/api/oauth
    • https://developers.google.com/drive/android/files
    0 讨论(0)
  •             Thread CrearEventoHilo = new Thread(){
                    public void run(){
                        //do something that retrun "Calling this from your main thread can lead to deadlock"
                    }
                };
                CrearEventoHilo.start();
    

    CrearEventoHilo.interrupt();

    public class Foo {
        MyThread mTh;
        void cantBeBothered() {
            mTh = new MyThread( /*...*/ );
            mTh.run();
            mTh.start();
        }
        void imFinishedNowWaitingForThread() {
            mTh.join();
        }
        void imOutKillingOffPendingThread()  {
            mTh.interrupt();
        }
    //  .....
        private class MyThread extends Thread {
    //      ...;
            MyThread( /*...*/) {
    //          this... = ...;
            }
            public void run() {
                doSomething( /*this...*/ );
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-01 13:22

    E/GoogleAuthUtil(4696): java.lang.IllegalStateException: calling this from your main thread can lead to deadlock

    Sounds like you need to do that on a separate thread, have you tried that?

    Here you can find information about threads in Android.

    0 讨论(0)
提交回复
热议问题