【发布时间】:2014-03-16 17:12:08
【问题描述】:
我开始将一些 PC Java 应用程序迁移到 Android 环境,这是一个关于 Android 平台的完整新手。
当我尝试使用 Service 引用作为Toast 消息的上下文时,我发现了一个问题。
这是我的服务代码的相关部分:
public class ServicePFPE extends Service {
Timer messageSimulator;
TimerTask messagePoll;
private class MessageReceptionTask extends TimerTask
{
public MessageReceptionTask(Context c) {
context = c;
}
@Override
public void run() {
String shownText = "Message received!! on " + (new Date(System.currentTimeMillis())).toString();
//doToast(shownText, context); //THIS LINE MAKES THE APP CRASH!
System.out.println(shownText); //But I can do this
}
private Context context;
}
public ServicePFPE() {
super();
messageSimulator = new Timer();
messagePoll = new MessageReceptionTask(this);
}
@Override
public IBinder onBind(Intent intent)
{
doToast("Service: onBind");
return null;
}
...
...
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
doToast("Service: onStartCommand");
messageSimulator.schedule(messagePoll, 5000, 5000);
return super.onStartCommand(intent, flags, startId);
}
...
...
...
private void doToast(String msg) { doToast(msg, this); }
private void doToast(String msg, Context con) {
Toast.makeText(con,msg,Toast.LENGTH_SHORT).show();
}
}
当计划任务运行到达 doToast 调用 Android 通知“不幸的是,myAPP 已停止”。
我认为这与我在不同线程中使用服务上下文的事实有关,但我不确定。
您能否确认是否是这种情况?从服务运行计时器并能够使用其上下文的正确方法是什么?如果这不可能,我能否获取该线程的上下文,以便生成 Toasts 用户消息。
【问题讨论】:
标签: java android multithreading