簡體   English   中英

方法無法在onStart()和onCreate()線程中循環

[英]Method failed to loop in onStart() and onCreate() thread

我正在按照教程進行操作。現在,我正在嘗試循環指紋認證部分,以便可以繼續重新認證用戶指紋。 我試圖在onStart()和onCreate()中使用線程來同時循環身份驗證,但是在兩種情況下應用程序都卡住了。

只能驗證一次的原始代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
    keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);

    if (!keyguardManager.isKeyguardSecure()){
        Toast.makeText(this,
                "Lock screen security is not enable in Settings", Toast.LENGTH_LONG).show();
        return;
    }

    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED){
        Toast.makeText(this,
                "Fingerprint authentication permission is not enabled", Toast.LENGTH_LONG).show();
        return;
    }

    if (!fingerprintManager.hasEnrolledFingerprints()){
        Toast.makeText(this, "Register at least one fingerprint in Settings", Toast.LENGTH_LONG).show();
        return;
    }

    generateKey();
    if (cipherInit()){
        cryptoObject = new FingerprintManager.CryptoObject(cipher);
        FingerprintHandler helper = new FingerprintHandler(this);
        helper.startAuth(fingerprintManager, cryptoObject);

    }

}

onStart()/ onCreate()中的線程失敗

    @Override
    protected void onStart() {
        super.onStart();
        new Thread(new Runnable(){
        public void run() {
            while(true)
                {
                    try {
                    Thread.sleep(50);
                    if (cipherInit()) {
                         cryptoObject = new FingerprintManager.CryptoObject(cipher);
                         FingerprintHandler helper = new FingerprintHandler(MainActivity.this);
                         helper.startAuth(fingerprintManager, cryptoObject);

                 }} catch (InterruptedException e){
                         e.printStackTrace();
            }
        }
    }
}).start();}

除了使用線程之外,我還嘗試使用AsyncTask為我執行while循環。 這是我創建班級的嘗試。 我的問題是cipherInit()駐留在MainActivity.java中,如何從我的Looping類中調用該方法?

Looping.java

    import android.hardware.fingerprint.FingerprintManager;
    import android.os.AsyncTask;

    public class Looping extends AsyncTask<Object,Void,Void> {
        FingerprintManager fingerprintManager;
        FingerprintManager.CryptoObject cryptoObject;
        Cipher cipher;
        @Override
        protected Void doInBackground(Void... arg0) {
            cipher = (Cipher) arg0[0];
            while(true) {
                if (cipherInit()) {
                    cryptoObject = new FingerprintManager.CryptoObject(cipher);
                    FingerprintHandler helper = new FingerprintHandler(MainActivity.this);
                    helper.startAuth(fingerprintManager, cryptoObject);

        }
    }
}}

主要活動

            Looping loop = new Looping();
            loop.execute(cipher, null, null);

這是我的第一個個人項目,但在整個Android結構方面我還是相對較新。 我真的很感謝你們的任何投入。 提前致謝

您不需要輔助線程或循環來進行身份驗證。 FingerprintManager.authenticate()的調用是在FingerprintHandler完成的(假定您與引用的教程具有相同的代碼)。 這是一個異步操作,並且在身份驗證成功或失敗時會回調處理程序( FingerprintManager.AuthentciationCallback )。 您需要根據成功/失敗采取行動,而不是在while循環中輪詢。 該回調將在您的主線程上發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM