我试图创建一个简单的Tap Counter应用程序,但是在它移动到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 :(得分:1)
首先是你如何运行你的应用程序?我注意到,当我在Debugmode中运行App时,调试器会占用移动设备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”添加到更新方法
答案 1 :(得分:0)
这里有两个因素:
首先onTick和onFinish将不会在确切的时间发生 - 在您的示例中,millisUntilFinished参数的值将为8995等,最高为990.
onTick方法中的第二个计算使用整数除法 - 余数被截断。所以在最后一次调用990/1000上继续我们的例子将是0,但onFinish将在大约1000ms之后被调用。