【问题标题】:Android SDK Timer Not WorkingAndroid SDK 计时器不工作
【发布时间】:2013-11-03 14:50:59
【问题描述】:

我一直在我的应用程序上编写一个计时器,这样当你点击一个按钮时,文本会显示一个以 0.1 秒为增量计数的时间。

我虽然编码正确,但事实证明,每当我点击手机上的就绪按钮时,应用程序就会崩溃......有人可以给我提示一下出了什么问题。我认为这可能与启动计时器有关?

我的 OnCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {



    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_double_player);

    Button readyBtn =  (Button) findViewById(R.id.readyBtn);



    readyBtn.setOnClickListener(new View.OnClickListener(){
        public void onClick(View arg0) {



            Button readyBtn =  (Button) findViewById(R.id.readyBtn);
            Spinner selectorLeft = (Spinner) findViewById(R.id.selectorLeft);
            Spinner selectorRight = (Spinner) findViewById(R.id.selectorRight);
            ImageView narLeft = (ImageView) findViewById(R.id.narwhalleft);
            ImageView narRight = (ImageView) findViewById(R.id.narwhalRight);


            selectorLeft.setVisibility(RelativeLayout.GONE);
            selectorRight.setVisibility(RelativeLayout.GONE);
            readyBtn.setVisibility(RelativeLayout.GONE);

            final TextView text = (TextView) findViewById(R.id.timerText);
            final Handler handler;
            text.setText(0);


            handler = new Handler();

            Runnable runnable = new Runnable(){
                boolean ready = true;
                int number = 0;

                @Override
                public void run(){
                    while(ready){
                        try{
                            Thread.sleep(100);
                            }
                        catch(InterruptedException e){
                            e.printStackTrace();
                            }
                        handler.post(new Runnable(){
                            @Override
                            public void run(){
                                number+=0.1;
                                text.setText(String.valueOf(number));
                                }
                            });
                    }
                }
            };
            new Thread(runnable).start();

            narRight.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View arg0) {
                    int clicksNeeded = 100;
                    boolean rightWon = false;
                    int clicksClickedRight = 0;

                    clicksClickedRight = clicksClickedRight + 1;

                    if(clicksClickedRight == clicksNeeded){

                        rightWon = true;
                        }
                    if(rightWon == true){


                    }

                }


            });

            narLeft.setOnClickListener(new View.OnClickListener(){
                public void onClick(View arg0) {
                    int clicksNeeded = 100;
                    boolean leftWon = false;
                    int clicksClickedLeft = 0;

                    clicksClickedLeft = clicksClickedLeft + 1;

                    if(clicksClickedLeft == clicksNeeded){

                        leftWon = true;
                        }
                    if(leftWon == true){


                    }

                }
            });


        }
    });


}

【问题讨论】:

  • 发布堆栈跟踪,看起来你有一些遗漏{brakects
  • 发布从您的应用崩溃到结束的 logCat。
  • 您的 LogCat 说了什么(当您的应用程序崩溃时,您应该会收到一堆红色错误消息)?如果可以,还可以使用调试器单步执行(在您的 readyBtn 单击侦听器中的第一条语句上设置断点)。这将帮助您了解导致错误的确切陈述,这也将使我们能够更有效地帮助您。
  • 您犯的最大错误是在您的 readyBtn.onClickListener() 方法中初始化所有指针。特别是重新初始化 readyBtn 指针。
  • 你可以使用处理程序而不是线程

标签: android timer crash clock stopwatch


【解决方案1】:

我可以看到你的线路有问题:

text.setText(0);

函数的声明是setText(int resid),所以它会尝试搜索id为0的字符串资源,但找不到,堆栈跟踪错误:

android.content.res.Resources$NotFoundException: String resource ID #0x0

所以将你的行替换为:

text.setText(String.valueOf(0));

第二件事,您已将 number 变量声明为 int:

int number = 0;

但是,您正在向其中添加一个浮点数:

number+=0.1;

所以声明它float number = 0;

要将您的数字四舍五入到小数点后一位,请使用此技巧,首先将数字相乘,将其转换为 int 以去除小数位并将其转换回浮点数:

float displaynumber = (float)((int)(number * 10.0))/10.0f;

【讨论】:

  • 感谢这是导致它崩溃的原因,但现在它没有更新它只是停留在 0
  • 看看我的新建议,我现在可以观察到 TextView text 显示的数字在变化。
  • 呃!!!当然它需要是一个浮点数,我是个傻瓜,谢谢你的回答,但现在我得到一个小数点后 5 位的数字,这与施法时间有关吗?
  • 这对于浮点类型来说是很正常的......它们不以十进制存储值,而是以二进制存储......值 0.1 不能精确地表示为 0.1,所以你会得到很多例子0.999999 或类似的东西,你必须找出如何舍入它。我可以得到一个绿色的复选标记吗? :)
  • 查看新建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多