从服务Android调用Toast时出错

可能重复:
从“服务”开始的Android Toast只显示一次

我正在使用android.app.Service中定义的服务Android。

我从一个Activity中调用这个Service(myService)。

我的服务是:

public class myService extends Service{ public IBinder onBind(Intent intent){ return null; } public void onCreate(){ super.onCreate(); TimerTask task = new TimerTask(){ public void run(){ Log.i("test","service running"); checkDate(); } }; timer = new Timer(); timer.schedule(task, 0, 20000); } public void checkDate(){ Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } } 

checkDate()方法驻留在myService类中。

产生的错误是:

  09-19 15:41:35.267: E/AndroidRuntime(2026): FATAL EXCEPTION: Timer-0 09-19 15:41:35.267: E/AndroidRuntime(2026): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.os.Handler.<init>(Handler.java:121) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast$TN.<init>(Toast.java:310) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.<init>(Toast.java:84) 09-19 15:41:35.267: E/AndroidRuntime(2026): at android.widget.Toast.makeText(Toast.java:226) 

Solutions Collecting From Web of "从服务Android调用Toast时出错"

TimerTask在一个单独的线程中运行。 Toast.makeText()必须从一个build立了Handler/Looper的线程中执行。 基本上这意味着你需要在拥有标准的Android消息/事件分派器的线程上运行Toast。

最简单的方法是在你的checkDate()方法中:

 runOnUiThread(new Runnable() { public void run() { Toast toast = Toast.makeText(this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } }); 

编辑:我是一个白痴,这是不对的。 您不能从Service上下文中调用runOnUiThread()

你需要为此使用一个Handler。 在您的服务中:

 private Handler handler; 

在你服务的onCreate()中:

 handler = new Handler(); 

checkDate()方法中:

 handler.post(new Runnable() { public void run() { Toast toast = Toast.makeText(myService.this, "SIMPLE MESSAGE!", Toast.LENGTH_LONG); toast.show(); } }); 

你从一个工作者线程调用它。 你需要在主线程中调用Toast.makeText()(和其他大多数处理UI的函数)。 例如,您可以使用处理程序。

您需要从UI线程调用Toast.makeText(…):

 activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); } });