2014-09-12 129 views
1

我正在尝试创建一个简单的Tap Counter应用程序,但在移动到onFinish()之前,我在最后得到了明显的滞后,在停止之前给予用户一些额外的水龙头柜台。Android:CountDownTimer中的onFinish()之前的延迟

这里是MainActivity.java

package com.example.tapcounter; 

import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.app.Activity; 

public class MainActivity extends Activity 
{ 
TextView time; 
TextView taps; 
Button b; 

int flag = 0; 
int count = 0, finalTap = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    time = (TextView) findViewById(R.id.textView1); 
    taps = (TextView) findViewById(R.id.textView2); 
    b = (Button) findViewById(R.id.button1); 

    b.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View arg0) 
     { 
      if(finalTap==0) 
      { 
       if(flag==0) 
       { 
        beginTimer(); 
        flag=1; 
       } 
       updateCount(); 
      } 
     } 
    }); 
} 

private void beginTimer() 
{ 
    new CountDownTimer(10000, 1000) 
    { 

     public void onTick(long millisUntilFinished) 
     { 
      time.setText("Time: "+millisUntilFinished/1000); 
     } 

     public void onFinish() 
     { 
      time.setText("Timeout!!!"); 
      finalTap++; 
     } 
    }.start(); 
} 

private void updateCount() 
{ 
    taps.setText("Taps: " + Integer.toString(++count)); 
} 
} 

回答

0

的因素有两个位置:

  • 第一onTick和onFinish不会发生在准确的时间 - 在你的榜样millisUntilFinished参数将有类似的值8995等达990.

  • 你的onTick方法中的第二次计算使用整数除法 - 余数被截断。因此,在最后一次调用990/1000时继续我们的示例将为0,但onFinish将仅在约1000毫秒后调用。

0

第一次如何运行你的应用程序?我注意到当我在Debugmode中运行一个应用程序时,调试器吃掉了我移动设备性能的50%。所以,如果你只是运行你的应用程序,onFinish的工作速度更快。

第二点是围绕手动检测超时的onTick方法的块一段时间用布尔

private boolean tapBlock = false; 

private void beginTimer() 
{ 
    new CountDownTimer(10100, 1000) 
    { 
    public void onTick(long millisUntilFinished) 
    { 
     if (!tapBlock) 
     { 
      time.setText("Time: "+millisUntilFinished/1000); 
      if (millisUntilFinished<100) 
      { 
      tapBlock = true; 
      } 
     } 
    } 

    public void onFinish() 
    { 
     time.setText("Timeout!!!"); 
     finalTap++; 
     tapBlock = false; 
    } 
    }.start(); 
} 

这是后水龙头一点,但它可能更快,你必须添加“ tapBlock“更新方法