我有一个简单的应用程序,打开ZXing的条形码扫描器应用程序。
现在,我想知道完成一次扫描需要多少时间。基本上,从意图开始的时间到获得结果的时间。现在,我知道这很简单,只要在执行意图时放置一个nanoTime对象,在获得结果时放置另一个nanoTime对象,将两者相减并乘以以秒/毫秒为单位。
然而,我有循环的意图,因为我想扫描QR码序列,我认为for循环是最好的方法。
所以我有几个全局时间变量长起始、结束、时间;
下面是意图的代码://Multi Scan Button
public Button.OnClickListener onMultiScan = new Button.OnClickListener() {
public void onClick(View v) {
//start = System.nanoTime();
for(int i = 0 ; i < 5 ; i++){
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
//start = System.nanoTime();
startActivityForResult(intent, multiScan);
}
}
};
下面是获取输入的代码。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//ordinary scan
if (requestCode == ordinaryScan) {
if (resultCode == RESULT_OK) {
end = System.nanoTime();
time = (end - start) / 1000000;
System.out.println("Time" + " " + /*i + +*/ time);
String contents = data.getStringExtra("SCAN_RESULT");
Toast.makeText(getApplicationContext(), contents, Toast.LENGTH_SHORT).show();
}
else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
//multiple scan
if (requestCode == multiScan) {
end = System.nanoTime();
time = (end - start) / 1000000;
System.out.println("Time" + " " + /*i + +*/ time);
if (resultCode == RESULT_OK) {
String content = data.getStringExtra("SCAN_RESULT");
//codes = codes + contents + " ";
inputs[counter] = content;
counter += 1;
if(counter == 5){
//output();
verify();
}
}
else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
}
我注释掉了我开始定时器的部分,因为我不确定把它们放在哪里。如果我在循环之前调用它,我只会得到一个结果,如果我把它放在循环中,我将得到多个结果,它们彼此相距不远。
如果一个intent只被调用一次,获取它完成所需的时间是很容易的,但是如果它在循环中被多次调用,就会变得很棘手。
那么,是否有一种方法可以适当地花费意图打开并获得结果所需的时间?我是开放的建议,即使这意味着重写我如何调用活动不止一次(我目前使用循环)。
我也更喜欢能够在代码被扫描后立即获得时间,所以我知道活动调用和活动结果之间的时间。我不想等到每个呼叫结束后才知道每个呼叫结束所花费的时间。我想要实时更新。谢谢。
如果您仍然希望使用循环,一种可能的方法是不使用单个multiscan requestcode,而是在每次循环运行时使用一个。
比如startActivityForResult(intent, MULTISCAN_BASE + i);
通过这种方式,您将能够单独跟踪所有运行,因为您将能够识别结果指的是哪个运行:
i = requestCode - MULTISCAN_BASE
最后一步是将开始时间放入数组中,每个循环一个。
int[] start = new int[5];
检查你什么时候完成并得到时间的总和是微不足道的。
好吧,我找到一个方法让它工作。老实说,这有点不完善,但它的工作和实时更新。基本概念是有一个multiScan requestCode,每次在onActivityResult方法中处理结果时,它都会增加一个。然后有一个if语句检查multiScan requestCode是否达到了所需的最大迭代次数。
全局变量如下:
int multiScan = 1;
int multiScanBase = 1;
long start, end, time;
然后multiScanButton
看起来是这样的
//Multi Scan Button
public Button.OnClickListener onMultiScan = new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
start = System.nanoTime();
startActivityForResult(intent, multiScan);
}
};
那么onActivityResult
方法看起来就像这样:
//multiple scan
if (requestCode < multiScanBase + 5 ) {
end = System.nanoTime();
time = (end - start) / 1000000;
System.out.println("Request Code = " + multiScan);
System.out.println("Time" + " " + /*i + +*/ time);
if (resultCode == RESULT_OK) {
String content = data.getStringExtra("SCAN_RESULT");
//codes = codes + contents + " ";
inputs[counter] = content;
counter += 1;
if(counter == 5){
//output();
verify();
}
}
else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
//This is the part where I check for the requestCode
//In this example, I wanted to iterate the activity 5 times
//So if the request code is still less than the base + number of iterations
//Increment the multiScan requestCode and run the method again
//In this way, the time for each scan is given in real time
if(requestCode < multiScanBase + 5){
multiScan += 1;
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, multiScan);
}
}
。代码为我工作,更新是实时给出的。谢谢你给我的建议。
大家圣诞快乐。