Google Glass Live Card菜单操作会导致崩溃

时间:2015-02-01 19:07:40

标签: java android nullpointerexception google-glass google-gdk

我在Google Glass上的Live Card菜单活动中遇到了一些 nullPointerException 问题。

我想:

  1. 通过触摸板上拉菜单。 (这有效)
  2. 可以在菜单中选择一些内容。 (这有效)
  3. 让选择执行该操作。 (这不起作用)
  4. 要执行的操作只是更改位于LiveCardService类中的变量的布尔值。

    我的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$1.onItemClick(SliderMenuView.java:81)
            at com.google.android.glass.widget.CardScrollView.onTap(CardScrollView.java:1453)
            at com.google.android.glass.widget.CardScrollView.access$2000(CardScrollView.java:94)
            at com.google.android.glass.widget.CardScrollView$3.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已在Manifest中注册。

    任何提示都会非常感激。

    编辑:为了清楚起见,我只需按一下按钮就可以通过调用我在LiveCardService类中创建的函数来更改位于我的LiveCardService类中的四个布尔变量的值这样做。这是启动LiveCard时LiveCardService类的外观

    @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;
    }
    

1 个答案:

答案 0 :(得分:2)

你绝对不应该保留这个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();
    }

}