1

ZXing によるバーコード スキャナー アプリを開く簡単なアプリケーションがあります。

ここで、スキャンが完了するまでにかかる時間を知りたいと思います。基本的にはインテントを起動してから結果が出るまで。インテントが実行されるときに nanoTime オブジェクトを配置し、結果を取得するときに別の nanoTime オブジェクトを配置し、2 を減算して乗算し、秒/ミリ秒で取得するだけです。

ただし、一連の 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
        }
    }
 }

タイマーをどこに置くべきかわからないので、タイマーを開始する部分をコメントアウトしました。ループの前にそれを呼び出すと、結果は 1 つしか得られず、ループ内に置くと、互いにそれほど遠くない複数の結果が得られます。

インテントが 1 回だけ呼び出された場合は、インテントが終了するまでの時間を取得するのは簡単ですが、ループで複数回呼び出された場合は注意が必要です。

では、意図を開いて結果を得るために必要な時間を適切に取る方法はありますか? アクティビティを複数回呼び出す方法を書き直すことを意味する場合でも、提案を受け付けています(現在ループを使用しています)。

また、コードがスキャンされた直後に時間を取得できるようにしたいので、アクティビティの呼び出しとアクティビティの結果の間の時間がわかります。各通話が終了するのにかかった時間を取得する前に、各通話が終了するのを待ちたくありません。リアルタイム更新を希望します。ありがとう。

4

2 に答える 2

1

それでもループを使用したい場合は、単一のマルチスキャン リクエストコードを使用するのではなく、ループの実行ごとに 1 つのマルチスキャン リクエストコードを使用する方法が考えられます。

何かのようなものstartActivityForResult(intent, MULTISCAN_BASE + i);

このようにして、結果がどの実行を参照しているかを認識できるため、すべての実行を個別に追跡できます。

i = requestCode - MULTISCAN_BASE

最後のステップは、ループのサイクルごとに 1 つずつ、開始時間を配列に入れることです。

int[] start = new int[5];

いつ完了したかを確認して時間の合計を取得するのは簡単です。

于 2012-12-23T08:06:02.300 に答える
0

さて、それを機能させる方法を見つけました。正直なところ、少し洗練されていませんが、機能し、リアルタイムで更新されます。基本的な概念は、onActivityResult メソッドで処理される結果が得られるたびに増加する multiScan requestCode を持つことです。次に、multiScan requestCode が必要な反復の最大数に達したかどうかをチェックする if ステートメントがあります。

したがって、グローバル変数は次のとおりです。

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);

        }
 }

そこで。コードは私のために機能し、更新はリアルタイムで提供されます。これを行う方法についてのアイデアをありがとう。

みなさんメリークリスマス。

于 2012-12-25T03:19:09.020 に答える