Android Studio中Java实现Pepper平板按钮触发动作崩溃问题求助
问题分析与解决
你的问题核心在于QiContext的生命周期与可用性:当你在onCreate里设置点击事件时,机器人还未完成连接或Activity未获得机器人焦点,此时QiContext尚未初始化或无效;而onRobotFocusedGained方法触发时,SDK已经确保你拿到了有效的机器人上下文,所以代码能正常执行。
另外看你给出的代码,doAnimation方法需要接收QiContext参数,但点击事件里调用doAnimation()时没有传参,这本身就会导致编译或运行时错误,也是崩溃的直接原因之一。
解决方案
- 在Activity中定义全局变量保存
QiContext,确保只有在机器人焦点获取后才持有有效实例 - 在
onRobotFocusedGained中初始化该全局变量,在onRobotFocusedLost中置空避免内存泄漏 - 点击事件中调用
doAnimation时,先判断全局QiContext是否有效,再传入参数执行
修正后的完整代码示例
public class YourRobotActivity extends AppCompatActivity implements RobotLifecycleCallbacks { // 全局保存有效的QiContext private QiContext mQiContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); // 确保你设置了对应布局文件 QiSDK.register(this, this); ImageButton button1 = findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先判断QiContext是否有效,避免空指针 if (mQiContext != null) { doAnimation(mQiContext); } } }); } private void doAnimation(QiContext qiContext) { // 创建动画对象 Animation myAnimation = AnimationBuilder.with(qiContext) .withResources(R.raw.sniffing_b001) .build(); // 构建动画动作并执行 Animate animate = AnimateBuilder.with(qiContext) .withAnimation(myAnimation) .build(); animate.run(); } @Override public void onRobotFocusGained(QiContext qiContext) { // 机器人焦点获取时,保存有效的QiContext mQiContext = qiContext; } @Override public void onRobotFocusLost() { // 机器人焦点丢失时,置空QiContext防止内存泄漏 mQiContext = null; } @Override public void onRobotFocusRefused(String reason) { // 处理焦点被拒绝的场景,比如给用户提示 Toast.makeText(this, "无法获取机器人焦点:" + reason, Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { QiSDK.unregister(this, this); super.onDestroy(); } }
关键说明
- 必须确保
QiContext仅在onRobotFocusGained之后使用,否则会因上下文无效触发空指针或SDK内部异常 - 在
onRobotFocusLost中置空QiContext,可以避免Activity销毁后仍持有机器人上下文导致的内存泄漏 - 点击事件中增加非空判断,能防止用户在未获取机器人焦点时点击按钮引发崩溃
内容的提问来源于stack exchange,提问作者Pepper Robot
相关产品推荐
相关产品推荐

