我需要有一个无限期工作的后台线程。我写了这段代码来定义一个IntentService:
public class RecordInternetUsageService extends IntentService {
public RecordInternetUsageService() {
super("test");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
synchronized (this) {
try {
wait(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Toast.makeText(this, "test", Toast.LENGTH_LONG).show();
}
}
我有两个问题,它是否适合在后台无限期地完成作业?
为什么当我想通过wait()方法使用这个线程时,请给我一个下面提到的异常?
“在死线程上向处理程序发送消息”。
我怎样才能解决这个问题?
答案 0 :(得分:3)
即使你的应用程序关闭也要进行长处理任务,即在后台必须使用服务...但你可以在主服务线程上进行长时间处理工作,否则你得到ANR(android没有响应)。因此,您必须创建一个后台线程并在该后台线程上提交所有任务(由 Handle 类完成)并处理所有提交和响应的内容...以结束此设计模式提供IntenServcie 课程。
IntentService类在提交作业时自动调用线程,当作业完成时,它会杀死sevrice并释放内存。 IntentSerive在完成其工作后立即退出。
这里的问题是您在由IntentService管理的线程中创建Toast。系统将使用与此线程关联的处理程序来显示和隐藏Toast。
首先正确显示Toast,但是当系统试图隐藏它时,在onHandleIntent方法完成之后,错误"在死线程上向处理程序发送消息"将被抛出,因为创建Toast的线程不再有效,。