可调用和未来延迟的android主线程

可调用和未来延迟的android主线程,android,future,callable,Android,Future,Callable,我想通过callable和future从服务中获取一些数据。这是我的代码之一: @Override public void getCIFilesType(Consumer<String> consumer) { try { consumer.accept(serviceExecutor.submit(() -> service.getCi(EsupFactory.getConfigString(SETTING_ROOT_C

我想通过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();
    }
}
我是我的活动我有一个菜单,然后点击菜单中的一个项目片段是活动中的一个事务。所有线程任务立即在片段中的
onViewCreated
中启动:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    presenter.getCis();
}
但当我点击菜单项
UI
时,所有任务都停止了,事务也停止了。这不是我第一次遇到这个问题。每次我使用callable and executor服务时,我都不知道为什么UI会被卷曲

这是分析器:

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

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


之所以会发生这种情况,是因为您正在对execute()方法返回的future调用get()。根据文件,

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

因此,即使使用后台线程,也可以通过调用get来阻止主线程,直到后台线程完成任务


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

什么是
使用的回调
?我使用
消费者
作为回调!!我不明白你的
使用回调的意义是什么?@StanislavShamilovYes,你把它用作回调,但问题是你调用的是get方法。正如我前面提到的,它是一个阻塞方法,所以调用线程(在本例中,它是一个Android主线程)将被阻塞,直到后台线程完成它的任务。所以,消费者的accept方法的调用将被延迟,直到执行此get方法。我认为,此So帖子可以帮助您:。或者您可以尝试使用一些框架来处理并发性,例如RxJava
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    presenter.getCis();
}