Невозможно запустить службу - PullRequest
0 голосов
/ 06 апреля 2019

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

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

Ответы [ 3 ]

0 голосов
/ 06 апреля 2019

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

0 голосов
/ 06 апреля 2019

Я бы порекомендовал прочитать о циклах событий здесь, есть несколько хороших статей, если вы ищете "цикл событий 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...
            }
        });
    }
}
0 голосов
/ 06 апреля 2019

Проблема: В разделе «Покупки» при запуске службы MyHostApduService вы не добавляете никаких дополнительных средств к цели, поэтому всегда получаете исключение NullPointerException.

Решение: Полагаю, из вашего кода вы хотите сначала запустить службу, когда пользователь изменяется в действии, а затем отправить пользователя в службу для обработки.

Шаг 1: Измените класс User для реализации интерфейса Parcelable.

public class User implements Parcelable {
    private String userName;
    private String creditCard;
    private String mail;

    public User() {
    }

    protected User(Parcel in) {
        userName = in.readString();
        creditCard = in.readString();
        mail = in.readString();
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getCreditCard() {
        return creditCard;
    }

    public void setCreditCard(String creditCard) {
        this.creditCard = creditCard;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(userName);
        dest.writeString(creditCard);
        dest.writeString(mail);
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

Шаг 2: Измените код в операции

user.observe(Purchase.this, new Observer<User>() {
    @Override
    public void onChanged(@Nullable User user) {
        i.putExtra("user", user);
        Purchase.this.startService(i);
    }
});

Шаг 3: Измените код в сервисе.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    user = intent.getParcelableExtra("user");
    if (user == null) {
        // The first time this service is started, user is not change yet.
    } else {
        // The next time this service is started, user is changed.
        Log.i("TAG", user.getCreditCard() + "");
    }
    return START_STICKY;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...