当前位置: 首页 > 知识库问答 >
问题:

异步任务Android OAuth2Client的方法

连坚白
2023-03-14

我正在尝试使用以下代码:

public static Token getAccessToken(OAuth2Config oauthDetails) {
    HttpPost post = new HttpPost(oauthDetails.getTokenEndPointUrl());
    String clientId = oauthDetails.getClientId();
    String clientSecret = oauthDetails.getClientSecret();
    String scope = oauthDetails.getScope();
    List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();
    parametersBody.add(new BasicNameValuePair(OAuthConstants.GRANT_TYPE,
            oauthDetails.getGrantType()));
    parametersBody.add(new BasicNameValuePair(OAuthConstants.USERNAME,
            oauthDetails.getUsername()));
    parametersBody.add(new BasicNameValuePair(OAuthConstants.PASSWORD,
            oauthDetails.getPassword()));
    if (isValid(clientId)) {
        parametersBody.add(new BasicNameValuePair(OAuthConstants.CLIENT_ID,
                clientId));
    }
    if (isValid(clientSecret)) {
        parametersBody.add(new BasicNameValuePair(
                OAuthConstants.CLIENT_SECRET, clientSecret));
    }
    if (isValid(scope)) {
        parametersBody.add(new BasicNameValuePair(OAuthConstants.SCOPE,
                scope));
    }
    DefaultHttpClient client = new DefaultHttpClient();
    HttpResponse response = null;
    Token accessToken = null;
    try {
        post.setEntity(new UrlEncodedFormEntity(parametersBody, HTTP.UTF_8));
        response = client.execute(post);
        int code = response.getStatusLine().getStatusCode();
        if (code >= 400) {
            Log.d(TAG, "Authorization server expects Basic authentication");
                // Add Basic Authorization header
            post.addHeader(
                    OAuthConstants.AUTHORIZATION,
                    getBasicAuthorizationHeader(oauthDetails.getUsername(),
                            oauthDetails.getPassword()));
            Log.d(TAG, "Retry with login credentials");
            try {
                response.getEntity().consumeContent();
            } catch (IOException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response = client.execute(post);
            code = response.getStatusLine().getStatusCode();
            if (code >= 400) {
                Log.d(TAG, "Retry with client credentials");
                post.removeHeaders(OAuthConstants.AUTHORIZATION);
                post.addHeader(
                        OAuthConstants.AUTHORIZATION,
                        getBasicAuthorizationHeader(
                                oauthDetails.getClientId(),
                                oauthDetails.getClientSecret()));
                try {
                    response.getEntity().consumeContent();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                response = client.execute(post);
                code = response.getStatusLine().getStatusCode();
                if (code >= 400) {
                    throw new RuntimeException(
                            "Could not retrieve access token for user: "
                                    + oauthDetails.getUsername());
                }
            }
        }
        Map map = handleResponse(response);
        accessToken = new Token(Long.valueOf((Integer) map.get(OAuthConstants.EXPIRES_IN)), (String) map.get(OAuthConstants.TOKEN_TYPE), (String) map.get(OAuthConstants.REFRESH_TOKEN), (String) map.get(OAuthConstants.ACCESS_TOKEN));
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
           // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return accessToken;
}

是我在Android应用程序中使用的OAuth2Client的一部分。我得到这个错误:

android.os.NetworkOnMainThreadException

我会提供一些帮助。

谢谢

共有1个答案

蒋健
2023-03-14

首先,您需要一个片段来包装AsyncTask,因此如果设备旋转,则不要创建多个请求并泄漏这些请求。此外,您还需要侦听器(GetAccessStokenCallbacks)来通知您的活动您已经完成并返回结果。

public class GetAccessTokenFragment extends Fragment {


OAuth2Config mOauthDetails;

static interface GetAccessTokenCallbacks {
  void onPostExecute(Token token);
}

private GetAccessTokenCallbacks mCallbacks;
private AccessTokenTask mTask;


@Override
public void onAttach(Activity activity) {
  super.onAttach(activity);
  mCallbacks = (GetAccessTokenCallbacks) activity;
}


@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setRetainInstance(true);
  // you must do it as follow
  // first create new instance
  // mOauthDetails = new OAuth2Config(....)
  // then use the values of MainActivity.this.mOauthDetails to initialize it


  mTask = new AccessTokenTask();
  mTask.execute();

}

@Override
public void onDetach() {
  super.onDetach();
  mCallbacks = null;
}



private class AccessTokenTask extends AsyncTask<Void, Void, Token> {

  @Override
  protected Token doInBackground(Void... param) {

    Token token = TheClassOfThisFunction.getAccessToken(mOauthDetails);
    return token;
  }

  @Override
  protected void onPostExecute(Token token) {
    if (mCallbacks != null) {
      mCallbacks.onPostExecute(token[0]);
    }
  }
 }
}

MainActivity中,必须实现GetAccessStokenFragment.GetAccessStokenCallbacks并创建GetAccessStokenFragment

public class MainActivity extends FragmentActivity implements GetAccessTokenFragment.GetAccessTokenCallbacks {

      public OAuth2Config mOauthDetails;

      private static final String TAG_GetAccessTokenFragment = "GetAccessToken";

      private GetAccessTokenFragment mGetAccessTokenFragment;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // Initialize mOauthDetails here


        FragmentManager fm = getSupportFragmentManager();
        mGetAccessTokenFragment = (GetAccessTokenFragment) fm.findFragmentByTag(TAG_GetAccessTokenFragment);

        if (mGetAccessTokenFragment == null) {
          mGetAccessTokenFragment = new GetAccessTokenFragment();
          fm.beginTransaction().add(mGetAccessTokenFragment, TAG_GetAccessTokenFragment).commit();
        }

      }

      @Override
      public void onPostExecute(Token token) {
          //you got your token here
      }
    }

似乎在下面调用了OAuthConfig:

public class OAuth2Client {
private final String username;
private final String password;
private final String clientId;
private final String clientSecret;
private final String site;
public OAuth2Client(String username, String password, String clientId, String clientSecret, String site) {
    this.username = username;
    this.password = password;
    this.clientId = clientId;
    this.clientSecret = clientSecret;
    this.site = site;
}
public String getUsername() {
    return username;
}
public String getPassword() {
    return password;
}
public String getClientId() {
    return clientId;
}
public String getClientSecret() {
    return clientSecret;
}
public String getSite() {
    return site;
}
public Token getAccessToken() {
    OAuth2Config oauthConfig = new OAuth2Config.OAuth2ConfigBuilder(username, password, clientId, clientSecret, site)
            .grantType("password").build();
    return OAuthUtils.getAccessToken(oauthConfig);
}

}

 类似资料:
  • 本文向大家介绍C#异步执行任务的方法,包括了C#异步执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我想调用一个方法,从一个AsyncWork,从另一个类,我正在尝试这个 但我得到错误“。你能帮助我吗? 我的扩展活动:

  • 我试图在这个类中实现异步任务,但问题是我在我的程序中调用了函数,该函数返回一个值,我不知道该把它放在哪里。在异步任务中,我应该在哪里定义?我得到以下例外 以下是我的主要课程: 这是我的解析类:公共类解析{ List headlines列出链接;列表描述;列出lstDate列出新日期;//字符串a,b,c,d;public InputStream getInputStream(URL URL){ t

  • 我有一组从基类继承的命令。基类有以下声明: 此异步方法缺少“await”运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。 显式提供任务完成返回值是否正确?

  • 主要内容:本节引言:,1.相关概念,2.AsyncTask全解析:,3.AsyncTask使用示例:,本节小结:本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称:应用程序,进程,线程,

  • 本文向大家介绍SpringBoot异步任务使用方法详解,包括了SpringBoot异步任务使用方法详解的使用技巧和注意事项,需要的朋友参考一下 步骤,如图所示: 1.添加异步任务业务类 2.添加测试控制器 3.添加启动类 4.右键项目Run As启动,访问url 结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。