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

LifecycleOwner处于RESUMED状态创建DropInClient触发异常求助

问题分析

异常java.lang.IllegalStateException: LifecycleOwner ... is attempting to register while current state is RESUMED的核心原因是:DropInClient内部会注册生命周期观察者,要求必须在Activity进入STARTED状态前完成初始化,而异步获取clientToken的请求返回时,Activity已经处于RESUMED状态,违反了这个限制。

解决方案

将DropInClient的初始化逻辑与异步token请求解耦,确保初始化操作在Activity生命周期的onCreate或onStart阶段执行(这两个阶段Activity尚未进入STARTED状态)。具体步骤如下:

  1. 将clientToken保存为Activity成员变量,而非通过LiveData触发初始化
  2. 异步获取到token后,根据当前生命周期状态决定是否立即初始化,或等待下一次onStart回调执行初始化
  3. 抽离统一的初始化方法,避免重复创建实例

修改后的代码示例:

private String amount = "";
private DropInClient dropInClient;
private DropInRequest dropInRequest = new DropInRequest();
private String clientToken; // 保存token为成员变量

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_donate);
    ButterKnife.bind(this);

    hideActionBar();
    getClientToken();
    setupListeners();
}

private void getClientToken(){
    try {
        BaseWebserviceAPI apiCall = APIClient.getInstance().getClient(true).create(BaseWebserviceAPI.class);
        Call<Map<String, String>> tokenCall = apiCall.getBtreeClientToken();
        tokenCall.enqueue(new GenericCallback<>(new GenericCallback.CallbackListener<Map<String, String>>() {
            @Override
            public void onDataReceived(Map<String, String> data) {
                clientToken = data.get("clientToken");
                // 若当前未进入STARTED状态,直接初始化
                if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
                    initDropInClient();
                }
            }

            @Override
            public void onRequestFailure() {
                showToast("Failed to fetch client token");
            }
        }));
    } catch (Exception e) {
        Log.d("CLIENTTOKENE", e.toString());
    }
}

@Override
protected void onStart() {
    super.onStart();
    // 每次进入onStart时检查,确保token已获取且实例未创建
    if (clientToken != null && !clientToken.isEmpty() && dropInClient == null) {
        initDropInClient();
    }
}

private void initDropInClient() {
    try {
        dropInClient = new DropInClient(DonateActivity.this, clientToken);
        dropInClient.setListener(DonateActivity.this);
        Log.d("LOGTRACETOKEN", "DropInClient initialized with token: " + clientToken);
    } catch (Exception e) {
        Log.d("LOGTRACETOKEN", e.toString());
    }
}

额外注意事项

  • 若需处理屏幕旋转等配置变化,可在onSaveInstanceState中保存clientToken,并在onCreate的savedInstanceState参数中恢复,避免重复请求token
  • 确保DropInClient仅初始化一次,防止重复注册生命周期观察者引发异常

内容的提问来源于stack exchange,提问作者Filip Budić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:11:20