无限期地在后台工作

时间:2014-12-04 06:52:34

标签: android service intentservice

我需要有一个无限期工作的后台线程。我写了这段代码来定义一个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()方法使用这个线程时,请给我一个下面提到的异常? “在死线程上向处理程序发送消息”。
我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

即使你的应用程序关闭也要进行长处理任务,即在后台必须使用服务...但你可以在主服务线程上进行长时间处理工作,否则你得到ANR(android没有响应)。因此,您必须创建一个后台线程并在该后台线程上提交所有任务(由 Handle 类完成)并处理所有提交和响应的内容...以结束此设计模式提供IntenServcie 课程。

IntentService类在提交作业时自动调用线程,当作业完成时,它会杀死sevrice并释放内存。 IntentSerive在完成其工作后立即退出。

这里的问题是您在由IntentService管理的线程中创建Toast。系统将使用与此线程关联的处理程序来显示和隐藏Toast。

首先正确显示Toast,但是当系统试图隐藏它时,在onHandleIntent方法完成之后,错误"在死线程上向处理程序发送消息"将被抛出,因为创建Toast的线程不再有效,。