Подтвердить что ты не робот

Тост, созданный в IntentService, никогда не уходит

У меня есть IntentService, который загружает некоторые файлы. Проблема в том, что я создаю Toast внутри IntentService, как это

Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show();

Тост никогда не исчезнет, ​​если я выйду из приложения. Единственный способ уничтожить его - убить процесс.

Что я делаю неправильно?

4b9b3361

Ответ 1

Вам не следует создавать Toast из Service. Вместо этого следует использовать Notification.

Ответ 2

Проблема заключается в том, что IntentService не работает в основном потоке приложения. вам нужно получить Handler для основного потока (в onCreate()) и отправить Toast в него как Runnable.

следующий код должен сделать трюк:

@Override
public void onCreate() {
    super.onCreate();
    mHandler = new Handler();
}

@Override
protected void onHandleIntent(Intent intent) {
    mHandler.post(new Runnable() {            
        @Override
        public void run() {
            Toast.makeText(MyIntentService.this, "Hello Toast!", Toast.LENGTH_LONG).show();                
        }
    });
}

Ответ 3

Это работает для меня:

public void ShowToastInIntentService(final String sText) {
    final Context MyContext = this;

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            Toast toast1 = Toast.makeText(MyContext, sText, Toast.LENGTH_LONG);
            toast1.show();
        }
    });
};

Ответ 4

IntentService создаст поток для обработки нового намерения и немедленно прекратит его сразу после выполнения задачи. Таким образом, тост не будет контролироваться мертвой нитью.

Вы должны увидеть некоторые исключения в консоли, когда на экране появится тост.

Ответ 5

Для тех, кто развивается в студии Xamarin, вот как это делается:

Handler handler = new Handler ();
handler.Post (() => {
    Toast.MakeText (_Context, "Your text here.", ToastLength.Short).Show ();
});

Ответ 6

Чтобы показать тост, когда пользователь находится в одном из приложений.

Просто нужна ссылка на текущую активность и вызовите ее с помощью этого примера кода:

public void showToast(final String msg) {
    final Activity a = currentActivity;
    if (a != null ) {
        a.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(a, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Есть много вариантов для получения текущей активности, проверьте этот вопрос: Как получить текущий контекст активности переднего плана в android?

Но я использую этот подход:

Приложение должно иметь:

private Activity currentActivity = null;

public Activity getCurrentActivity() {
    return currentActivity;
}

public void setCurrentActivity(Activity mCurrentActivity) {
    this.currentActivity = mCurrentActivity;
}

Каждое действие должно иметь:

@Override
protected void onResume() {
    super.onResume();
    ((MyApplication) getApplication()).setCurrentActivity(this);

}
@Override
protected void onPause() {
    super.onPause();
    ((MyApplication) getApplication()).setCurrentActivity(null);
}