Ale*_*lex 1 android sphero-api
我正在制作一款使用Sphero机器人球的游戏.当游戏启动/恢复时,它会检查配对或连接的球.如果蓝牙关闭,或者没有球配对,它会隐藏连接窗口.如果有球配对但未连接,则进入此功能.
// If the user clicked a Sphero and it failed to connect, this event will be fired
@Override
public void onRobotConnectionFailed(Robot robot) {
Log.d("activity", "onRobotConnectionFailed");
removeConnectionView();
}
Run Code Online (Sandbox Code Playgroud)
它在以下方法中崩溃.
private void removeConnectionView() {
mFrameLayout.removeView(mSpheroConnectionView);
mSpheroConnectionView = null;
}
Run Code Online (Sandbox Code Playgroud)
此功能适用于其他可能的结果.这是错误.
Thread [<14> Thread-2606] (Suspended (exception ViewRootImpl$CalledFromWrongThreadException))
<VM does not provide monitor information>
ViewRootImpl.checkThread() line: 5031
ViewRootImpl.invalidateChildInParent(int[], Rect) line: 998
FrameLayout(ViewGroup).invalidateChild(View, Rect) line: 4358
ImageView(View).invalidate(boolean) line: 10565
ImageView(View).invalidate() line: 10520
ImageView.invalidateDrawable(Drawable) line: 202
XDrawable(Drawable).invalidateSelf() line: 382
XDrawable(Drawable).setVisible(boolean, boolean) line: 578
ImageView.onDetachedFromWindow() line: 1196
ImageView(View).dispatchDetachedFromWindow() line: 12136
FrameLayout(ViewGroup).dispatchDetachedFromWindow() line: 2824
RelativeLayout(ViewGroup).dispatchDetachedFromWindow() line: 2824
SpheroConnectionView$SpheroItemView(ViewGroup).dispatchDetachedFromWindow() line: 2824
SpheroConnectionView$SpheroListView(ViewGroup).dispatchDetachedFromWindow() line: 2824
SpheroConnectionView(ViewGroup).dispatchDetachedFromWindow() line: 2824
FrameLayout(ViewGroup).removeViewInternal(int, View) line: 3943
FrameLayout(ViewGroup).removeViewInternal(View) line: 3918
FrameLayout(ViewGroup).removeView(View) line: 3850
discgroove.removeConnectionView() line: 233
discgroove.access$4(discgroove) line: 232
discgroove$2.onRobotConnectionFailed(Robot) line: 191
SpheroConnectionView$4.onRobotConnectionFailed(Robot) line: 157
RobotProvider.update(Observable, Object) line: 570
Robot(Observable).notifyObservers(Object) line: 138
Robot.setConnected(boolean) line: 300
DeviceConnection$4.run() line: 378
Run Code Online (Sandbox Code Playgroud)
从一个不是主Looper线程(或"UI线程")的线程调用removeConnectionView方法.视图只能从主循环线程修改.
为了解决这个问题,请在主Looper线程上实例化一个Handler(例如在创建视图或Activity时),并使用该Hander#post(Runnable)方法调用您的方法,或者View#post(Runnable)在FrameLayout上使用该方法.
第一类示例:
将它放在Activity的onCreate方法中,该方法始终在主Looper线程中运行.
mHandler = new Handler();
Run Code Online (Sandbox Code Playgroud)
然后,当您想要运行该方法时:
handler.post(new Runnable() {
@Override
public void run() {
mFrameLayout.removeView(mSpheroConnectionView);
mSpheroConnectionView = null;
}
});
Run Code Online (Sandbox Code Playgroud)
第二种示例:
mFrameLayout.post(new Runnable() {
@Override
public void run() {
mFrameLayout.removeView(mSpheroConnectionView);
mSpheroConnectionView = null;
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |