• android开发中,遇到定时器跟线程同时用的问题


      最近开发新的项目,需要实现一个功能:

                    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()来获取当前线程中的消息循环。

        这样线程跟消息搭配就可以实现上述功能。

  • 相关阅读:
    ES6:Iterator遍历器
    前端:对BFC的理解
    前端:性能优化之防抖与节流
    ES6新增数据类型Symbol
    ajax和fetch、aixos的区别
    我对js数据类型的理解和深浅(copy)的应用场景
    egg的基本使用
    前端:css3的过渡与动画的基础知识
    Java基础篇之类
    JAVA基础篇之Scanner
  • 原文地址:https://www.cnblogs.com/whbCNW/p/android.html
Copyright © 2020-2023  润新知