Dialogflow聊天机器人安卓APP出现Objects.requireNonNull崩溃问题求解

崩溃核心原因及修复方案
- RecyclerView未设置LayoutManager(你怀疑的代码段的问题根源)
你代码中仅给RecyclerView设置了Adapter,没有配置LayoutManager,调用chatView.getLayoutManager()会返回null,Objects.requireNonNull()检测到空值就会直接抛出空指针异常导致崩溃。
修复方式:在chatView.setAdapter(chatAdapter);前添加LayoutManager配置代码:
LinearLayoutManager layoutManager = new LinearLayoutManager(this); // 聊天内容默认从底部开始展示,符合聊天场景使用习惯 layoutManager.setStackFromEnd(true); chatView.setLayoutManager(layoutManager);
AsyncTask废弃导致的兼容问题
代码中使用的SendMessageInBg继承自AsyncTask,该类在Android 11及以上系统已被正式废弃,存在内存泄漏、任务调度异常等问题,容易引发崩溃。
修复方式:替换为协程、Thread+Handler或者OkHttp异步请求来实现Dialogflow接口的异步调用,同时增加页面销毁时的任务取消逻辑,避免后台任务返回后操作已销毁的页面。初始化异常未处理引发的空指针
setUpBot()方法如果抛出异常(比如credentials文件错误、读取失败),sessionsClient和sessionName会是null,此时点击发送消息直接传空值给后台任务会触发崩溃。
修复方式:在发送消息前增加判空校验:
private void sendMessageToBot(String message) { // 先校验机器人初始化状态 if (sessionsClient == null || sessionName == null) { Toast.makeText(this, "机器人初始化失败,请稍后重试", Toast.LENGTH_SHORT).show(); return; } QueryInput input = QueryInput.newBuilder() .setText(TextInput.newBuilder().setText(message).setLanguageCode("en-US")).build(); new SendMessageInBg(this, sessionName, sessionsClient, input).execute(); }
- 必要权限检查
确认AndroidManifest.xml中已经添加网络权限,否则请求Dialogflow服务会直接崩溃:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Daniele Giongo
相关产品推荐
相关产品推荐

