You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中用户已登录Facebook时获取用户信息失败(onCompleted未触发)

解决Android Facebook GraphRequest onCompleted未调用的问题

嘿,作为Java新手碰到这个异步操作的坑太正常了!我来帮你拆解问题,一步步搞定它~

核心问题分析

你的代码有两个关键问题导致onCompleted没执行,还拿不到用户数据:

  1. 没有发起Graph请求:你只创建了GraphRequest对象,但完全没触发这个网络请求,所以回调方法自然不会被调用;
  2. 异步逻辑错误:GraphRequest是异步操作,你的getUserDataFromFacebook直接return name时,name还没被赋值(因为onCompleted还没执行),这是典型的异步同步化误解。

具体解决方案

第一步:添加请求执行代码

首先,创建GraphRequest后必须调用executeAsync()来发起异步请求,这是触发onCompleted的关键:

第二步:用回调处理异步结果

因为异步操作无法直接返回结果,咱们可以定义一个简单的回调接口,用来传递获取到的用户数据(避免主线程等待阻塞)。

完整修改后的代码如下:

  1. 先定义回调接口(可以放在你的Activity类内部)
// 定义回调接口,用于传递异步获取的用户数据
interface UserDataCallback {
    void onUserDataReceived(String userName);
    void onError(Exception e);
}
  1. 修改getUserDataFromFacebook方法,改为接收回调并发起请求
private void getUserDataFromFacebook(AccessToken accessToken, UserDataCallback callback) {
    Log.v("LoginActivity", "I am here");
    GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                Log.v("LoginActivity", "RESPONSE: " + response);
                try {
                    Log.v("LoginActivity", "I am inside onCompleted!");
                    String name = object.getString("name");
                    // 成功获取数据后,通过回调传递给调用方
                    callback.onUserDataReceived(name);
                } catch (JSONException e) {
                    e.printStackTrace();
                    // 出错时也通过回调通知
                    callback.onError(e);
                }
            }
        });
    // 关键:发起异步请求
    request.executeAsync();
}
  1. 在调用处使用回调更新UI
AccessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken != null) {
    getUserDataFromFacebook(accessToken, new UserDataCallback() {
        @Override
        public void onUserDataReceived(String userName) {
            // GraphRequest的onCompleted默认在主线程,可直接更新UI
            headerTitle.setText(userName);
        }

        @Override
        public void onError(Exception e) {
            // 处理错误场景,比如提示用户
            headerTitle.setText("获取用户信息失败");
        }
    });
}

额外注意事项

  • 检查Facebook SDK配置:确保AndroidManifest.xml里的App ID、权限(如INTERNET)都配置正确,否则请求会静默失败;
  • 调试错误:如果还是有问题,可以在onCompleted里打印response.getError(),查看具体的错误信息(比如权限不足、网络问题);
  • 异步思维:Android里大部分网络操作都是异步的,以后碰到类似场景记得用回调、LiveData或者协程(Kotlin)来处理结果,不要试图同步return异步数据。

内容的提问来源于stack exchange,提问作者Dominykas55

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:50