java - android:ExecutorService:- ExecutorService 不等待 executorService 完成

标签 java android android-layout android-studio jakarta-ee

我有一个executorService,它不等待executorService部分完成,它直接返回返回值而不等待 下面是我的代码:请查看我是否正确实现了executorService,并在需要时帮助我纠正它

 public boolean validateForm() {
        flag=true;
        executorService = Executors.newSingleThreadExecutor();
            Future f = executorService.submit(new Runnable() {
                public void run() {
                    Log.e("FLAGssssss", "" + flag);
                    checkSourceCode(new BooleanCallBack() {
                        @Override
                        public void onSuccess(boolean result) {
                            Log.e("RESULT  ISSSSS", "" + result);
                            validateCode = result;
                            Log.e("validateSourceCode  ISSSSS", "" + validateSourceCode(result));
                            if (validateSourceCode(result) == false) {
                                flag = false;
                            }
                            Log.e("FLAG ISSSSS", "" + flag);
                        }
                    });
                }
            });
            try {
                if (f.get() != null) {
                    flag = true;
                }
                Log.e("FUTURE IS", "" + f.get());

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        if (!accept_checkbox.isChecked()) {
            Toast.makeText(getActivity().getBaseContext(), "Accept The Terms & Conditions To Proceed", Toast.LENGTH_LONG).show();
            //        accept_checkbox.requestFocus();
            flag = false;
        }
        if (!validateAddress()) {
            flag = false;
        }
        if (!validatelandmark()) {
            flag = false;
        }
        if (!validateDistrict()) {
            flag = false;
        }
        if (!validatePincode()) {
            flag = false;
        }
        if (!validateFullfillment()) {
            flag = false;
        }
        if (flag) {
            saveData();
        }

        executorService.shutdown();
        return flag; //flag is returned even before the executorService above is executed first
    }

最佳答案

看起来对于构造回调和执行回调的构成存在一些混淆。

以下代码创建并提交一个新的 Runnable 任务,但 Runnable 只是打印一条消息,然后构造一个 BooleanCallBack。我不确定 BooleanCallBack 到底做了什么,但假设它确实是一个回调,回调中的代码不会立即执行。

为了简单起见,让我们将 Runnable 想象成这样:

Future future = executorService.submit(new Runnable() {
    public void run() {
        sysou("runnable is running");
        checkSourceCode(new BooleanCallBack() {
            @Override
            public void onSuccess(boolean result) {
                sysou("callback from the runnable is running");
            }
        });
    }
});

当您调用 future.get() 时,它会等待 run() 方法完成执行,其中涉及构造 BooleanCallBack但实际上并没有运行它。与构造新的 Runnable 对象并不意味着执行 run() 方法中的代码类似。

因此,如果您的代码调用 future.get(),您唯一可以确定的是 run() 方法已完成(即您已收到“runnable is running”消息)。 没有 BooleanCallBack.onSuccess() 已经执行。

如果您确实想等待“来自可运行对象的回调正在运行”位,那么您需要建立对 BooleanCallBack 的引用,以便检查其状态。

关于java - android:ExecutorService:- ExecutorService 不等待 executorService 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40373515/

相关文章:

java - 从字符串构建 JTree

android - RecyclerView(水平)嵌套在 BottomSheet 中防止垂直滚动

android - Froyo (Android 2.2) 源代码

java - 以编程方式创建布局并设置 ClickListener(android)

android - 如何使布局可以水平和垂直滚动?

java - 以编程方式创建 Java8 函数引用

java - 使用 JTable 正确排序 double

java - Hibernate 一对一单向更新

java - Android - 打开 session 不适用于最新的 Facebook 应用程序版本,如果未安装 Facebook,则工作正常

android - ListView自定义第一个cell