繁体   English   中英

Android-测量通过意图打开活动与收到结果之间的时间

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM