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状态)。具体步骤如下:
- 将clientToken保存为Activity成员变量,而非通过LiveData触发初始化
- 异步获取到token后,根据当前生命周期状态决定是否立即初始化,或等待下一次
onStart回调执行初始化 - 抽离统一的初始化方法,避免重复创建实例
修改后的代码示例:
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ć
相关产品推荐
相关产品推荐

