Не удается запустить службу

#android #android-service

#Android #android-сервис

Вопрос:

Я пытаюсь запустить службу, но получаю сообщение об ошибке. Я понятия не имею, как решить эту конкретную проблему. Класс, в котором я запускаю форму службы:

 package com.example.test;

public class Purchase extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_purchase);
        final Intent i = new Intent(this,MyHostApduService.class);
        Livedate<User> user = *something*;
        user.observe(Purchase.this, new Observer<User>() {
            @Override
            public void onChanged(@Nullable User user) {
                i.putExtra("user name", user.getUserName());
                i.putExtra("credit card", user.getCreditCard());
                i.putExtra("context", Purchase.class);
                i.putExtra("mail", user.getMail());
            }
        });
        Toast.makeText(Purchase.this, "YOU CAN ONLY MAKE A PURCHASE AFTER GETTING CLOSE TO THE OTHER DEVICE", Toast.LENGTH_SHORT).show();
        this.startService(i);
    }

}
  

служба:

 public int onStartCommand(Intent intent, int flags, int startId) {
    creditCard = intent.getExtras().getString("credit card");
    return START_STICKY;
}
  

ошибка:

 java.lang.RuntimeException: Unable to start service com.example.test.MyHostApduService@fe81f37 with Intent { cmp=com.example.test/.MyHostApduService }: 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
  

Ответ №1:

Намерение, которое вы передаете службе, не имеет свойства «кредитная карта». Это потому, что вы запускаете службу с пустым намерением (без дополнительных функций). Код i.putExtra("credit card", user.getCreditCard()); выполняется только при внесении изменений в LiveData. При первом запуске activity ничего не запускает OnChanged LiveData.

Ответ №2:

Я бы рекомендовал прочитать о циклах событий здесь, есть несколько хороших статей, если вы ищете «цикл событий Android».

Фактически происходит то, что ваш метод «onCreate» и «OnChanged» являются обратными вызовами. «onCreate» будет выполнен полностью, прежде чем «OnChanged» сможет запуститься. Это означает, что вы запускаете службу без аргументов, получая исключение нулевого указателя. Как правило, вы не хотите использовать объект в нескольких обратных вызовах, если этого можно избежать.

Один из возможных способов обойти это — запустить службу при поступлении новых данных. Но будьте осторожны, что произойдет, если возможны множественные изменения в пользовательских данных.

 package com.example.test;

public class Purchase extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_purchase);
        Livedate<User> user = *something*;
        user.observe(Purchase.this, new Observer<User>() {
            @Override
            public void onChanged(@Nullable User user) {
                final Intent i = new Intent(this,MyHostApduService.class);
                i.putExtra("user name", user.getUserName());
                i.putExtra("credit card", user.getCreditCard());
                i.putExtra("context", Purchase.class);
                i.putExtra("mail", user.getMail());
                Purchase.this.startService(i);
                Toast...
            }
        });
    }
}