[英]Android - Measuring the time between opening an activity via intent and when results are received
我有一个简单的应用程序,可以通过ZXing打开Barcode Scanner App。
现在,我想知道扫描需要多少时间。 基本上,是从启动意图开始的时间到获得结果的时间。 现在,我知道这很简单,只需在执行意图时放置一个nanoTime对象,然后在获取结果时放置另一个nanoTime,然后将两者相减并相乘即可得到秒/毫秒。
但是,我有on循环的意图,因为我想扫描一系列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
}
}
}
我注释掉了启动计时器的部分,因为我不确定将其放置在哪里。 发生的事情是,如果我在循环之前调用它,只会得到一个结果,如果将其放入循环中,则会得到多个结果,彼此之间相差不远。
如果仅一次调用一个意图即可获得完成所需的时间,这很容易,但是如果多次调用它,就会变得很棘手。
那么,有没有办法适当地花费时间来打开意图并获得结果呢? 我乐于接受建议,即使这意味着要重写我多次调用活动的方式(我目前正在使用循环)。
我还希望能够在立即扫描代码后立即获得时间,因此我知道了活动调用和活动结果之间的时间。 我不想等待每个通话结束,直到我得到每个通话结束所花费的时间。 我想实时更新。 谢谢。
如果仍要使用循环,则一种可能的方法是不使用单个多重扫描请求代码,而是为循环的每次运行使用一个。
类似于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);
}
}
所以那里。 该代码对我有用,并且实时给出更新。 感谢您提供有关如何执行此操作的想法。
大家圣诞快乐。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.