Android 显示来自广播接收器的延迟吐司

Android 显示来自广播接收器的延迟吐司,android,Android,我试图在BroadcastReceiver接收到事件后的某个时间向用户显示消息 public class MyReceiver extends BroadcastReceiver { private Timer timer = new Timer(); @Override public void onReceive(Context context, Intent intent) { // Display message in 10 sec. timer.s

我试图在BroadcastReceiver接收到事件后的某个时间向用户显示消息

public class MyReceiver extends BroadcastReceiver {

  private Timer timer = new Timer();

  @Override
  public void onReceive(Context context, Intent intent) {
      // Display message in 10 sec.
      timer.schedule(new MessageTask(context, "Test Message"), 10 * 1000);
  }

  private static class MessageTask extends TimerTask {
    public MessageTask(Context context, String message) {
      this.context = context;
      this.message = message;
    }

    public void run() {
      Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
  }
}
当我运行此命令时,会出现以下异常:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
这样做对吗?我应该使用计时器以外的东西吗?在这种情况下,获取上下文对象的正确方法是什么


谢谢

这行不通。一旦onReceive()方法完成,手机就可以自由地返回睡眠状态或做任何它想做的事情。您必须实现唤醒锁定。

这不起作用。一旦onReceive()方法完成,手机就可以自由地返回睡眠状态或做任何它想做的事情。您必须实现唤醒锁。

您可以尝试使用。像线一样使用它:


新的烤面包机(yourContext,yourMessageResId,Toast.LENGTH_LONG).start();

您可以尝试使用。像线一样使用它:


新的烤面包机(yourContext,yourMessageResId,Toast.LENGTH_LONG).start();

在Kevin Gaudin bellow发布的示例的指导下,我意识到为了从不同的线程与UI交互,需要手动管理Android消息循环

在pseudo中,这看起来像这样:

import android.content.Context;
import android.os.Looper;

public class MyUIThread extends Thread {

    public MyUIThread(Context context) {
      // Probably going to need a context to do anything useful.  So
      // pass it in.
      this.context = context;
    }

    public void run() {
      Looper.prepare();
      // Do some UI stuff, e.g. Toast.makeText
      Looper.loop();
    }

}

在Kevin Gaudin bellow发布的示例的指导下,我意识到为了从不同的线程与UI交互,需要手动管理Android消息循环

在pseudo中,这看起来像这样:

import android.content.Context;
import android.os.Looper;

public class MyUIThread extends Thread {

    public MyUIThread(Context context) {
      // Probably going to need a context to do anything useful.  So
      // pass it in.
      this.context = context;
    }

    public void run() {
      Looper.prepare();
      // Do some UI stuff, e.g. Toast.makeText
      Looper.loop();
    }

}