Тост не заканчивается после нажатия кнопки «Назад» на устройстве Android? - PullRequest
0 голосов
/ 28 декабря 2018

Я разрабатываю платное приложение, которое проверяет лицензию при запуске (из метода onCreate()) приложения.После получения кодов ответа от сервера выполняются последующие методы обратного вызова allow(), dontAllow(), applicationError(), которые содержат различные Toasts.

Теперь мой вопрос заключается в том, что всякий раз, когда генерируется любая Toasts иесли вдруг я нажму назад устройства Button до завершения Toast, то Toast застревает на экране.Это завершается только тогда, когда я удаляю приложение из списка задач.

 private class XYZLicenseCheckerCallback implements LicenseCheckerCallback {

    @Override
    public void allow(int reason) {
        if(isFinishing()) {
            return;
        }

        Toast.makeText(XyzActivity.this,"App purchase verified",Toast.LENGTH_SHORT).show();
        System.out.println("allowed called"+reason);
    }

    @Override
    public void dontAllow(int reason) {
        if(isFinishing()) {
            return;
        }

        displayResult(String.valueOf(reason));
        stopService(serviceIntent);
        Toast.makeText(XyzActivity.this,"App not licensed",Toast.LENGTH_SHORT).show();
        System.out.println("don't allow called"+reason);
    }

    @Override
    public void applicationError(int errorCode) {
        if(isFinishing()) {
            return;
        }

        Toast.makeText(XyzActivity2108.this,"Not able to verify the license,check your internet connection",Toast.LENGTH_SHORT).show();
        // finish();
        System.out.println("app error called"+errorCode);
    }
}

Вот мой onBackpressed() метод

@Override
public void onBackPressed() {
    finish();
}

Любая помощь с вашей стороны, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Почему бы вместо этого не использовать снэк-бар?
Это сообщение вашего приложения, а не системное сообщение.

Ваш тост остается на экране даже после завершения упражнения.Снэк-бар не делает.

Обратитесь к этому ответу от stackoverflow для получения дополнительной информации.


Даже если вы не хотите использовать закусочную.Это не похоже на ожидаемое поведение вашего кода.Причиной проблемы может быть длительно работающий поток , который все еще связан с сервером или еще не завершил .Убедитесь, что код, инициирующий это (XYZLicenseCheckerCallback), выполняется правильно и не заставляет приложение не отвечать.

Примечание : при взаимодействии с потоком пользовательского интерфейса необходимо принять дополнительные меры.

0 голосов
/ 20 февраля 2019

передать контекст в конструкторе и Toast с этим контекстом

 private class XYZLicenseCheckerCallback implements LicenseCheckerCallback {
 Activity mActivity;
 public XYZLicenseCheckerCallback (Activity mActivity){
 this.mActivity= mActivity;
 }
@Override
public void allow(int reason) {
    if(isFinishing()) {
        return;
    }

    Toast.makeText(mActivity,"App purchase verified",Toast.LENGTH_SHORT).show();
    System.out.println("allowed called"+reason);
}

@Override
public void dontAllow(int reason) {
    if(isFinishing()) {
        return;
    }

    displayResult(String.valueOf(reason));
    stopService(serviceIntent);
    Toast.makeText(mActivity,"App not licensed",Toast.LENGTH_SHORT).show();
    System.out.println("don't allow called"+reason);
}

@Override
public void applicationError(int errorCode) {
    if(isFinishing()) {
        return;
    }

    Toast.makeText(mActivity,"Not able to verify the license,check your internet connection",Toast.LENGTH_SHORT).show();
    // finish();
    System.out.println("app error called"+errorCode);
 }
 }
0 голосов
/ 28 декабря 2018

Создайте глобальную переменную Toast toast;

Чтобы показать ее, используйте

toast = Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT);
toast.show();

Затем нажмите «Назад» и отмените тост.

@Override
public void onBackPressed() {
    toast.cancel();
    finish();
}
...