AsyncTask 비동기식 동기화

2926 단어 androidbug
프로젝트 배경: 지문 결제에서 IFAA 설비 ID를 얻고 일부 제조업체 시스템이 업그레이드된 후에 ID 수령 시간 초과 현상이 발생하며 판정 처리를 하지 않은 상황에서 제품은 전 라인이 붕괴될 수 있다.
프로젝트: 프로젝트를 시작할 때 IFAA를 초기화합니다.
/**
 *    ifaaDeviceId,    
 *
 * @param typeFingerprint
 */
public static void initIfaaDeviceIdByType(int typeFingerprint) {
	long startTime = System.currentTimeMillis();
	LogUtils.d(TAG, "initIfaaDeviceIdByType start type:" + typeFingerprint);

	if (authenticator == null) {
		authenticator = AuthenticatorManager.create(PayKernelApplication.getInstance(), typeFingerprint, appName);
	}
	//   null
	if (authenticator == null) {
		ifaaDeviceId = "";
		isSupportIfaaDeviceId = false;
		sendIfaaNetLog(startTime, "  authenticator  ");
		return;
	}

	if (!authenticator.isSupported()
			|| !authenticator.hasEnrolled()) {
		ifaaDeviceId = "";
		isSupportIfaaDeviceId = false;
		sendIfaaNetLog(startTime, "   IFAA");
		return;
	}

	String log = "";
	executor = (Executor) Executors.newCachedThreadPool();
	mTask = new IfaaSdkDeviceIdTask(authenticator);
	try {
		mTask.executeOnExecutor(executor);
		ifaaDeviceId = mTask.get(TIME_OUT, TimeUnit.MILLISECONDS);
		if (TextUtils.isEmpty(ifaaDeviceId)) {
			isSupportIfaaDeviceId = false;
			log = "initIfaaDeviceIdByType    ifaaDeviceId  " + ifaaDeviceId;
		} else {
			isSupportIfaaDeviceId = true;
			log = "initIfaaDeviceIdByType    ifaaDeviceId:" + ifaaDeviceId;
		}
	} catch (InterruptedException e) {
		ifaaDeviceId = "";
		isSupportIfaaDeviceId = false;
		log = "initIfaaDeviceIdByType  InterruptedException";
		authenticator.cancel();
	} catch (ExecutionException e) {
		ifaaDeviceId = "";
		isSupportIfaaDeviceId = false;
		log = "initIfaaDeviceIdByType  ExecutionException";
		authenticator.cancel();
	} catch (TimeoutException e) {
		ifaaDeviceId = "";
		isSupportIfaaDeviceId = false;
		log = "initIfaaDeviceIdByType    ";
		authenticator.cancel();
	}
	LogUtils.d(TAG, log); 
}
public class IfaaSdkDeviceIdTask extends AsyncTask {

    private IAuthenticator mIAuthenticator;

    public IfaaSdkDeviceIdTask(IAuthenticator iAuthenticator) {
        this.mIAuthenticator = iAuthenticator;
    }

    @Override
    protected String doInBackground(Void... params) {
        String deviceId = null;
        if (mIAuthenticator != null) {
            //  ifaa DeviceId 
            deviceId = mIAuthenticator.getDeviceId();
        }

        //  DeviceId
        return deviceId;
    }

    @Override
    protected void onPostExecute(String result) {
    }
}

세부 정보: mTask.get () 방법은 시간 초과 판단 방법입니다. 정해진 시간에 다른 스레드가 완성되지 않은 경우 시간 초과 이상이 발생하지만 원래의 스레드는 계속 실행되기 때문에 시간 초과 처리 중 deviceId를 가져오는 작업을 중단해야 합니다. mTask.get () 에서 얻은 결과는 DoInBackground가 되돌아오는 결과이기 때문에 onPostExecute에서 결과를 다시 처리할 필요가 없습니다. 그렇지 않으면 2차 처리의 논리적 혼란이 발생할 수 있습니다.

좋은 웹페이지 즐겨찾기