最近开发新的项目,需要实现一个功能:
1.先弹出一个友好的提示框:正在处理数据。
2。等处理完数据后,关闭提示框。弹出一个60秒倒计时的复合框。复合框上的倒计时从硬件里读出。而关闭复合框的条件是:需要对硬件进行操作或者当定时器为0时,才能让复合框消失。
3。当对复核后操作后,再弹出一个友好的提示框,提示:成功或者失败。
就这么一个小功能,由于刚开始接触android,不是很熟悉它其中的各种机制。对于我来说,头疼了好几天。然后在一个同事的指点下,突然发现了一条光明的道路。实验了一下,竟然成功了。
在其过程中,碰到以下几种问题:
1.start called from thread。
2.java.lang.RuntimeException: Only one Looper may be created per thread。
3.Activity has leaked window that was originally added。
4.Can't create handler inside thread that has not called Looper.prepare()。
上述问题,主要是对android中线程跟定时器混搭使用,更新页面而导致的错处。没有清楚理解和意识到android中线程跟消息的重要性。
解决思路如下:
1.一个提示框的函数。
2.启动一个线程,处理数据,等数据处理后,发送一个消息。消息包含对复核框、定时器的创建和任务对复合框倒计时器的操作。
解决依据:
Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。
Handler不带参数的默认构造函数:new Handler(),实际上是通过Looper.myLooper()来获取当前线程中的消息循环。
这样线程跟消息搭配就可以实现上述功能。