【问题标题】:Callable and future delay android main thread可调用和未来延迟android主线程
【发布时间】:2019-02-19 09:30:17
【问题描述】:

我想通过 callable 和 future 从服务中获取一些数据。这是我的代码之一:

@Override
public void getCIFilesType(Consumer<String> consumer) {
    try {
        consumer.accept(serviceExecutor.submit(() ->
                service.getCi(EsupFactory.getConfigString(SETTING_ROOT_CI) + "GetCI",
                        translator.makeCiJsonObject("PCiName", "CI_FilesType")).execute())
                .get().body().string());
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我有 10 个像上面这样执行的方法。我使用 Executor 服务来运行 callable

ExecutorService serviceExecutor = Executors.newSingleThreadExecutor();

我是我的活动我有一个菜单,然后单击菜单中的一项,片段是活动中的事务。所有线程任务立即在片段中的onViewCreated 开始:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    presenter.getCis();
}

但是当我点击菜单项时,UI 被卷曲,直到所有任务都停止,然后事务就停止了。这不是我第一次遇到这个问题。每次我使用 callable 和 executor 服务时,我都不知道为什么 UI 是毛茸茸的!!!!

这是分析器:

有人给我一些指导!!?请不要告诉我使用 asyncTask :-)

什么是读行??在ui线程中我只是做事务而不执行长时间运行的任务!!!

【问题讨论】:

    标签: android future callable


    【解决方案1】:

    发生这种情况是因为您在 execute() 方法返回的未来上调用 get()。根据文档,

    如果您想立即阻止等待任务,可以使用以下形式的构造 result = exec.submit(aCallable).get();

    因此,即使您使用后台线程,通过调用 get 也会阻塞您的主线程,直到后台线程完成您的任务。

    为了避免 UI 垃圾,您应该使用回调。

    【讨论】:

    • used callbacks 是什么意思?我用Consumer 作为回调!!我不明白你used callbacks 的意思是什么?@StanislavShamilov
    • 是的,您将其用作回调,但问题是您正在调用 get 方法。正如我之前提到的,它是一个阻塞方法,所以调用线程(在这种情况下,它是一个 Android 主线程)将被阻塞,直到后台线程完成它的任务。所以消费者的accept方法的调用会延迟到这个get方法执行完毕。
    • 我认为,这篇 SO 帖子可以帮助您:stackoverflow.com/questions/826212/…。或者你可以尝试使用一些框架来处理并发,例如,RxJava
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多