Google Glass Live Card 菜单操作导致崩溃
Google Glass Live Card Menu Action Causes Crash
我在 Google Glass 上的 Live Card 菜单 Activity 遇到一些 nullPointerException 问题。
我想:
- 通过触摸板调出菜单。 (这个有效)
- 能够 select 菜单中的内容。 (这个有效)
- 有select离子执行动作。 (这不起作用)
要执行的操作只是更改位于我的 LiveCardService
class.
中的变量的布尔值
我的 LiveCardMenuActivity
代码如下所示 -
public class LiveCardMenuActivity extends Activity {
LiveCardService liveCard; // call in the livecardservice class
// ... STANDARD MENU STUFF ... //
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_stop:
// Stop the service which will unpublish the live card.
stopService(new Intent(this, LiveCardService.class));
return true;
case R.id.action_ttoro:
liveCard.resetWaypoints(); // THIS IS WHERE IT CRASHES
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
在这种情况下,当程序尝试执行 "livecard.resetWaypoints()"
时,程序会崩溃并显示 nullPointerException
。
LiveCardService 中的 "resetWaypoints()"
函数看起来像这样(没什么特别的)-
public void resetWaypoints() {
ttoroActive = false;
bgbukActive = false;
lassyActive = false;
dployActive = false;
}
怪物logcat投诉是这样的-
E/InputEventSender﹕ Exception dispatching finished signal.
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI﹕ java.lang.NullPointerException
at [...].LiveCardMenuActivity.resetWaypoints(LiveCardMenuActivity.java:57)
at [...].LiveCardMenuActivity.onOptionsItemSelected(LiveCardMenuActivity.java:42)
at android.app.Activity.onMenuItemSelected(Activity.java:2604)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1054)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:765)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:908)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:898)
at com.google.android.glass.menu.SliderMenuView.onItemClick(SliderMenuView.java:81)
at com.google.android.glass.widget.CardScrollView.onTap(CardScrollView.java:1453)
at com.google.android.glass.widget.CardScrollView.access00(CardScrollView.java:94)
at com.google.android.glass.widget.CardScrollView.onGesture(CardScrollView.java:383)
at com.google.android.glass.touchpad.CombinedListener.onGesture(CombinedListener.java:185)
at com.google.android.glass.touchpad.OneFingerState.onEvent(OneFingerState.java:49)
at com.google.android.glass.touchpad.StateMachine.onEvent(StateMachine.java:100)
at com.google.android.glass.touchpad.GestureDetector.onMotionEvent(GestureDetector.java:283)
at com.google.android.glass.widget.CardScrollView.dispatchGenericFocusedEvent(CardScrollView.java:2103)
at android.view.View.dispatchGenericMotionEvent(View.java:7778)
at android.view.ViewGroup.dispatchGenericFocusedEvent(ViewGroup.java:1798)
at android.view.View.dispatchGenericMotionEvent(View.java:7778)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:2154)
at android.view.ViewRootImpl$ViewPostImeInputStage.processGenericMotionEvent(ViewRootImpl.java:3995)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3859)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3547)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3448)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3604)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3448)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3580)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3740)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:131)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.
我想执行的操作似乎很简单。我看过 Google 的文档,据我所知,它们只是提供了一个非常简单的菜单示例。
此 liveCardMenuActivity
已在清单中注册。
如有任何提示,我们将不胜感激。
编辑:为了清楚起见,我希望通过调用一个按钮来更改位于我的 LiveCardService class 中的那四个布尔变量的值我在 LiveCardService class 中创建的一个函数就是这样做的。这是启动 LiveCard
时 LiveCardService class 的样子
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (mLiveCard == null) { //WHEN ACTIVITY STARTS, LIVECARD IS NULL
// Create live card object
mLiveCard = new LiveCard(this, TAG);
// Set rendering view of the live card
remoteViews = new RemoteViews(getPackageName(), R.layout.live_card02);
// Can contain TextView, ImageView, etc
mLiveCard.setViews(remoteViews);
// Display the options MENU when the live card is tapped.
Intent menuIntent = new Intent(this, LiveCardMenuActivity.class);
mLiveCard.setAction(PendingIntent.getActivity(this, 100, menuIntent, 0));
mLiveCard.publish(PublishMode.REVEAL);
// Runs this live card every xxxx milliseconds
mHandler = new Handler();
mHandler.postDelayed(runnable, 1000);
}
else {
mLiveCard.navigate();
Log.d(TAG, "Livecard is not null");
}
return START_STICKY;
}
你绝对不应该保留这个 LiveCardService 实例。
你应该更愿意谈谈你的服务不明意图:
Intent intent = new Intent(this, LiveCardService.class);
intent .setAction("RESET");
startService(intent);
然后,在您的服务中:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if("RESET".equals(intent.getAction()) {
// do the reset here
resetWaypoints();
}
}
我在 Google Glass 上的 Live Card 菜单 Activity 遇到一些 nullPointerException 问题。
我想:
- 通过触摸板调出菜单。 (这个有效)
- 能够 select 菜单中的内容。 (这个有效)
- 有select离子执行动作。 (这不起作用)
要执行的操作只是更改位于我的 LiveCardService
class.
我的 LiveCardMenuActivity
代码如下所示 -
public class LiveCardMenuActivity extends Activity {
LiveCardService liveCard; // call in the livecardservice class
// ... STANDARD MENU STUFF ... //
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_stop:
// Stop the service which will unpublish the live card.
stopService(new Intent(this, LiveCardService.class));
return true;
case R.id.action_ttoro:
liveCard.resetWaypoints(); // THIS IS WHERE IT CRASHES
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
在这种情况下,当程序尝试执行 "livecard.resetWaypoints()"
时,程序会崩溃并显示 nullPointerException
。
LiveCardService 中的 "resetWaypoints()"
函数看起来像这样(没什么特别的)-
public void resetWaypoints() {
ttoroActive = false;
bgbukActive = false;
lassyActive = false;
dployActive = false;
}
怪物logcat投诉是这样的-
E/InputEventSender﹕ Exception dispatching finished signal.
E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI﹕ java.lang.NullPointerException
at [...].LiveCardMenuActivity.resetWaypoints(LiveCardMenuActivity.java:57)
at [...].LiveCardMenuActivity.onOptionsItemSelected(LiveCardMenuActivity.java:42)
at android.app.Activity.onMenuItemSelected(Activity.java:2604)
at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1054)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:765)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:908)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:898)
at com.google.android.glass.menu.SliderMenuView.onItemClick(SliderMenuView.java:81)
at com.google.android.glass.widget.CardScrollView.onTap(CardScrollView.java:1453)
at com.google.android.glass.widget.CardScrollView.access00(CardScrollView.java:94)
at com.google.android.glass.widget.CardScrollView.onGesture(CardScrollView.java:383)
at com.google.android.glass.touchpad.CombinedListener.onGesture(CombinedListener.java:185)
at com.google.android.glass.touchpad.OneFingerState.onEvent(OneFingerState.java:49)
at com.google.android.glass.touchpad.StateMachine.onEvent(StateMachine.java:100)
at com.google.android.glass.touchpad.GestureDetector.onMotionEvent(GestureDetector.java:283)
at com.google.android.glass.widget.CardScrollView.dispatchGenericFocusedEvent(CardScrollView.java:2103)
at android.view.View.dispatchGenericMotionEvent(View.java:7778)
at android.view.ViewGroup.dispatchGenericFocusedEvent(ViewGroup.java:1798)
at android.view.View.dispatchGenericMotionEvent(View.java:7778)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:2154)
at android.view.ViewRootImpl$ViewPostImeInputStage.processGenericMotionEvent(ViewRootImpl.java:3995)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3859)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3547)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3448)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3604)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3448)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3421)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3471)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3440)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3580)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3740)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:131)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.
我想执行的操作似乎很简单。我看过 Google 的文档,据我所知,它们只是提供了一个非常简单的菜单示例。
此 liveCardMenuActivity
已在清单中注册。
如有任何提示,我们将不胜感激。
编辑:为了清楚起见,我希望通过调用一个按钮来更改位于我的 LiveCardService class 中的那四个布尔变量的值我在 LiveCardService class 中创建的一个函数就是这样做的。这是启动 LiveCard
时 LiveCardService class 的样子@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (mLiveCard == null) { //WHEN ACTIVITY STARTS, LIVECARD IS NULL
// Create live card object
mLiveCard = new LiveCard(this, TAG);
// Set rendering view of the live card
remoteViews = new RemoteViews(getPackageName(), R.layout.live_card02);
// Can contain TextView, ImageView, etc
mLiveCard.setViews(remoteViews);
// Display the options MENU when the live card is tapped.
Intent menuIntent = new Intent(this, LiveCardMenuActivity.class);
mLiveCard.setAction(PendingIntent.getActivity(this, 100, menuIntent, 0));
mLiveCard.publish(PublishMode.REVEAL);
// Runs this live card every xxxx milliseconds
mHandler = new Handler();
mHandler.postDelayed(runnable, 1000);
}
else {
mLiveCard.navigate();
Log.d(TAG, "Livecard is not null");
}
return START_STICKY;
}
你绝对不应该保留这个 LiveCardService 实例。
你应该更愿意谈谈你的服务不明意图:
Intent intent = new Intent(this, LiveCardService.class);
intent .setAction("RESET");
startService(intent);
然后,在您的服务中:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if("RESET".equals(intent.getAction()) {
// do the reset here
resetWaypoints();
}
}