AsyncTask异步转同步

2 篇文章 0 订阅

项目背景:指纹支付中获取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<Void, Void, String> {

    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中不需要再次对结果进行处理,否则会出现二次处理的逻辑混乱。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,AsyncTask 是一种轻量级的异步任务处理方式,它可以在后台线程中执行任务,然后将结果返回到 UI 线程中进行处理。如果需要按照顺序同步执行多个任务,可以在 AsyncTask 中对任务进行排序并依次执行。 下面是一个按照顺序同步执行任务的 AsyncTask 示例代码: ```java public class MyTask extends AsyncTask<Void, Void, Void> { private List<Runnable> mTasks = new ArrayList<>(); public void addTask(Runnable task) { mTasks.add(task); } @Override protected Void doInBackground(Void... params) { for (Runnable task : mTasks) { task.run(); } return null; } } ``` 在上面的代码中,我们定义了一个 MyTask 类,它继承自 AsyncTask。我们使用一个 List 来存储所有需要执行的任务,并在 doInBackground() 方法中对任务进行排序并依次执行。我们还提供了一个 addTask() 方法,用于添加需要执行的任务。 我们可以这样使用 MyTask 类来执行多个任务: ```java MyTask task = new MyTask(); task.addTask(new Runnable() { @Override public void run() { // 执行任务1 } }); task.addTask(new Runnable() { @Override public void run() { // 执行任务2 } }); task.addTask(new Runnable() { @Override public void run() { // 执行任务3 } }); task.execute(); ``` 在上面的代码中,我们创建了一个 MyTask 对象,并依次添加了三个需要执行的任务。最后,我们调用 execute() 方法来启动异步任务。 需要注意的是,AsyncTask 并不保证任务的顺序执行,但是我们可以利用上述方式来实现顺序同步执行任务。同时,如果任务之间存在依赖关系,需要保证任务的执行顺序。可以使用线程或异步任务的等待机制来实现这种依赖关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值