Действие меню Google Glass Live Card вызывает сбой

У меня возникла проблема с nullPointerException при работе с меню Live Card в Google Glass.

Я бы хотел:

  1. Откройте меню с помощью сенсорной панели. (Это работает)
  2. Уметь что-то выбрать в меню. (Это работает)
  3. Пусть этот выбор выполнит действие. (Это не работает)

Действие, которое нужно выполнить, это просто изменить логическое значение переменной, расположенной в моем 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,

"resetWaypoints()" функция в LiveCardService выглядит так (ничего особенного) -

public void resetWaypoints() {
    ttoroActive = false;
    bgbukActive = false;
    lassyActive = false;
    dployActive = false;
}

Жалоба на чудовище выглядит так:

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 зарегистрирован в Манифесте.

Любые советы будут высоко ценится.

РЕДАКТИРОВАТЬ: Просто чтобы быть ясно, я хочу одним нажатием кнопки, чтобы иметь возможность изменить значения этих четырех логических переменных, которые находятся в моем классе LiveCardService, вызывая функцию, которую я создал в классе LiveCardService, который делает это. Так выглядит класс LiveCardService при запуске LiveCard

@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 ответ

Решение

Вы определенно не должны хранить этот экземпляр 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();
    }

}
Другие вопросы по тегам