[英]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.