0

磁気カードデータを読み取るためにAsyncTaskを起動するアプリに取り組んでいます。メインスレッドはスリープし、ブールフラグwaitForStripeがfalseに設定されているかどうかを毎秒チェックします。もしそうなら、それは継続します。AsyncTask doInBackground出口を見ることができますが、onPostExecuteに到達することはありません。もともと私はAsyncTaskのonPostExecuteでwaitForSwipe変数を設定しました。doInBackgroundの最後にブール値を設定することでこれを回避しましたが、実行後のメソッドが呼び出されないことに戸惑っています。

onPostExecuteが正しく宣言されているロギングを含めています。この実行では、onPostExecuteはcaMainWaitForStripeを設定しますが、それでも実行されていないようです。

10:04:45.940: D/Ca.PocessTrans(5360): CaiSerial  
10:04:45.960: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:1  
10:04:45.960: D/CaiReader(5360): requesting startSwipeCard in background.  
10:04:45.960: D/CaiReader(5360): doInBackground main thread? false  
10:04:46.000: I/System.out(5360): top of read loop 1, started: false  
10:04:46.520: I/System.out(5360): wait for swipe  
10:04:46.520: I/System.out(5360): wait for start 1  
10:04:46.520: I/System.out(5360): top of read loop 2, started: false  
10:04:46.960: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:2  
10:04:47.030: I/System.out(5360): wait for swipe  
10:04:47.030: I/System.out(5360): wait for start 2  
10:04:47.030: I/System.out(5360): top of read loop 3, started: false  
10:04:47.540: I/System.out(5360): wait for swipe  
10:04:47.540: I/System.out(5360): wait for start 3  

... here it was just waiting for me to swipe the card  

01-08 10:04:50.090: I/System.out(5360): top of read loop 9, started: false  
01-08 10:04:50.600: I/System.out(5360): wait for swipe  
01-08 10:04:50.600: I/System.out(5360): wait for start 9  
01-08 10:04:50.600: I/System.out(5360): top of read loop 10, started: false  
01-08 10:04:50.960: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:6  
01-08 10:04:51.110: I/System.out(5360): wait for swipe  
01-08 10:04:51.110: I/System.out(5360): wait for start 10  
01-08 10:04:51.110: I/System.out(5360): top of read loop 11, started: false  
01-08 10:04:51.120: I/System.out(5360): starting data  
01-08 10:04:51.130: I/System.out(5360): read 121 - bytes:121: val: 02  

... echoing the bytes read from card  

01-08 10:04:51.490: I/System.out(5360): read 121 - bytes:121: val: 6F  
01-08 10:04:51.500: I/System.out(5360): read 121 - bytes:121: val: 03  
01-08 10:04:51.510: I/System.out(5360): wait for swipe  
01-08 10:04:51.510: I/System.out(5360): top of read loop 12, started: true  
01-08 10:04:51.520: I/System.out(5360): end data  
01-08 10:04:51.520: I/System.out(5360): Exiting card reader total read 121  
01-08 10:04:51.550: I/System.out(5360): lrc ok  
01-08 10:04:51.550: I/System.out(5360): computed checksum: 6f  
01-08 10:04:51.550: I/System.out(5360): checksum ok  
01-08 10:04:51.680: D/CaiReader(5360): RS232 setting Enc Data  
01-08 10:04:51.680: D/EpayData(5360):  setEncryptedData : good swipe  

.. echoing encrypted data  

01-08 10:04:51.680: D/CaiReader(5360): leaving 'wait for stripe'  
01-08 10:04:51.960: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:7  
01-08 10:04:52.960: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:8  
01-08 10:04:53.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:9  
01-08 10:04:54.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:10  
01-08 10:04:55.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:11  
01-08 10:04:56.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:12  
01-08 10:04:57.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:13  
01-08 10:04:58.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:14  
01-08 10:04:59.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:15  
01-08 10:05:00.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:16  
01-08 10:05:01.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:17  
01-08 10:05:02.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:18  
01-08 10:05:03.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:19  
01-08 10:05:04.970: D/Ca.ProcessTrans(5360): wait for swipe, sleeping...:20  
01-08 10:05:05.970: D/Ca.PocessTrans(5360): break timeout 'wait for swipe'  
01-08 10:05:06.120: D/CaiReader(5360): Done, result: Data set  

私は完全に困惑しています。スワイプを待った後ではなく、CaiReader(AsyncTask)がスコープ外になると、onPostExecuteが起動されるようです。

asyncTaskは次のとおりです。

class CaiReader extends AsyncTask<EpayData, Long, String> {
    private final String S_TAG = "CaiReader";

    protected void onProgressUpdate(Integer... progress) {
        Log.d("Progress", "Progress");
}
@Override
protected void onPostExecute(String result) {
    Log.d(S_TAG, "Done, result: " + result);
    // caMainWaitSwipe = false;
}
// protected void onPostExecute(Long result) {
//    Log.d(S_TAG, "Done, result: " + result);
//}

/**
 * this is controlling task. It launches  card reader.
*/
@Override
protected String doInBackground(EpayData... params) {
    Log.d(S_TAG, "requesting startSwipeCard in background.");
    showThread(S_TAG, "doInBackground");
    EpayData epayData = params[0];
    byte[] scan = caiSerialReader.readCard();
    if (scan == null) {
        return "failure";
    }
    Map<String, String> rs232Map = CaiRs232Read.parseScan(scan);
    String KSN = rs232Map.get(CaiSerialReader.RS232_KSN);
    String encBlock = rs232Map.get(CaiSerialReader.RS232_ENC_BLOCK);
    Log.d(S_TAG, "RS232 setting Enc Data");
    epayData.setEncryptedData(encBlock, KSN);
    Log.d("CAPTURE", "KSN: " + KSN);
    Log.d("CAPTURE", "encBlock: " + encBlock);
    caMainWaitSwipe = false;
    Log.d(S_TAG, "leaving 'wait for stripe' ");
    String success = "set";
    return success;
}

}

呼び出し側プログラム:

if (readerType == ReaderType.RS232) {
                Log.d("Ca.PocessTrans", "CaiSerial");
                caMainWaitSwipe = true;
                int i = 0;
                CaiReader caiReader = (CaiReader) new CaiReader().execute(epayData);

                while (caMainWaitSwipe) {
                    i++;
                    if (i > 20) {
                        Log.d("Ca.PocessTrans", "break timeout 'wait for swipe'");
                    return DsiParser.timedOutError();
                    }
                    try {
                        Log.d("Ca.ProcessTrans", "wait for swipe,     sleeping...:" + i);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Log.d("Ca.ProcessTrans", "process tran     interrupted exception");
                        e.printStackTrace();
                    }
                }
                Log.d("Ca.PocessTrans", "exit rs232 wait for stripe");
            }
            if (!epayData.isReadGood()) {
                return DsiParser.swipeError();
            }
        }
        Log.d("Ca.PocessTrans", "data read");
        authorizeTransaction(epayData);
4

3 に答える 3

1

onPostExecuteメソッドのシグネチャに問題があると思います。パラメータは、long型ではなくstring型である必要があります。オーバーライドされたすべてのメソッドの上に@Overrideアノテーションを付けて、コンパイラーが何が悪いのかを教えてくれるようにすることをお勧めします。もう1つは、ステータスを確認するためのループは必要ないということです。これはすべてメソッドで実行し、onPostExecuteで呼び出すことができます。

于 2013-01-07T19:05:28.263 に答える
0

メインスレッドがスリープしている場合、メインスレッドは呼び出しAsynconPostExecute()行わず、到達しません。doInBackground()毎秒、または好きなだけ長く、または状態に達するまで睡眠をとってください。次に、この値をメインアクティビティに戻したり、関数を呼び出したり、で実行したいことを何でもできますUI。メインスレッドはスリープしないはずです。または、タイマーを使用することもできますUI

于 2013-01-07T19:02:24.533 に答える
0

現在、あなたはからAsyncTask onPostExecute()戻ってきているのでオーバーライドしていませんが、結果を受け取っているので、次のようにコードを変更してください:StringdoInBackground()Long

class CaiReader extends AsyncTask<EpayData, Long, String> {
    private final String S_TAG = "CaiReader";

    protected void onProgressUpdate(Integer... progress) {
        Log.d("Progress", "Progress");
     }
@Override
protected void onPostExecute(String result) {  //<< chnage to String
    Log.d(S_TAG, "Done, result: " + result);
}

/**
 * this is controlling task. It launches  card reader.
*/
@Override
protected String doInBackground(EpayData... params) {

     //your code here
   return null;  //<< return string from here
}

}
于 2013-01-07T19:05:57.107 に答える