«Тост» сообщение через TimerTask - PullRequest
4 голосов
/ 25 октября 2011

Я нашел некоторую информацию о том, как получить доступ к контексту из подкласса, а также некоторую информацию о

runOnUiThread(new Runnable() {
  public void run() {
    // Do something
  }
});

Но в моем случае это не работает. Приложение все еще работает, но активность, возможно, уже уничтожена. Первое (основное) действие - это родительское действие того, где создается моя TimerTask. Мой код:

TimerTask tt = new TimerTask() {
  @Override
  public void run() {
    // do something (cut)

    // and at the end show info
    getParent().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        Toast.makeText(getParent(),
                  getResources().getString(R.string.st_toast_msg_stopped),
                  Toast.LENGTH_LONG).show();
      }
    });
  }
};
curTimer.schedule(tt, millisecondsUntilStop);

Нет ошибок / исключений в журнале. Но сообщение с тостами не отображается. : - (

Теперь я понятия не имею, что еще я могу сделать / попробовать. Я надеюсь, что кто-то из вас может мне помочь.

П.С .: Может быть, я использую неправильный контекст? Но я пробовал и другой контекст, например, контекст текущей деятельности, ApplicationContext, ....

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Хорошо, вы используете неправильный контекст, который является getParent(). Вместо использования getParent() попробуйте использовать current_Activity.this, например,

TimerTask tt = new TimerTask() {
  @Override
  public void run() {
    // do something (cut)

    // and at the end show info
    Activity_name.this.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        Toast.makeText(Activity_name.this,
                  getResources().getString(R.string.st_toast_msg_stopped),
                  Toast.LENGTH_LONG).show();
      }
    });
  }
};
0 голосов
/ 25 октября 2011

Вместо использования TimerTask, почему бы не использовать AlarmManager и установить PendingIntent для отключения трансляции? Когда вы запускаете трансляцию и ловите ее в своем созданном вами BroadcastReciever, в BroadcastReciever у вас будет контекст для отображения вашего тоста. Вот быстрый пример высокого уровня.

Где бы вы ни настраивали TimerTask в своей деятельности, сделайте это вместо:

AlarmManager alarmManager = (AlarmManager)Context.getSystemService(Context.ALARM_SERVICE);
Intent broadcastIntent = new Intent("yourBroadcastAction");
PendingIntent pendingIntent = PendingIntenet.getBroadcast(this, 0, broadcastIntent, 0);
alarmManager.set(AlarmManager.ELAPSED_REALTIME, millisecondsUntilStop, broadcastIntent);

Затем просто создайте BroadcastReciever, который имеет фильтр для yourBroadcastAction, и в методе onRecieve() сделайте тост примерно так:

public void onRecieve(Context context, Intent intent){
  Toast.makeText(context,
              getResources().getString(R.string.st_toast_msg_stopped),
              Toast.LENGTH_LONG).show();
}
...