可调用和未来延迟 android 主线程
Callable and future delay android main thread
我想通过 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 个像这样执行的方法 above.I 使用 Executor 服务 运行 callable
:
ExecutorService serviceExecutor = Executors.newSingleThreadExecutor();
我是我的 activity 我有一个菜单,然后单击菜单中的一个项目片段是 activity 中的一个事务。所有线程任务立即在 onViewCreated
片段中开始:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
presenter.getCis();
}
但是当我点击菜单项 UI
时,它变得很乱,直到所有任务都停止,然后交易停止。这不是我第一次遇到这个问题。每次我用callable和executor service我都不知道为什么UI是毛躁的!!!!
这是分析器:
Someone has some guidance for me!!? Please do not tell me to use asyncTask :-)
What is a read line?? In ui thread I just do transaction not execute long running task!!!
发生这种情况是因为您在 execute() 方法返回的未来调用 get()。根据文档,
If you would like to immediately block waiting for a task, you can use constructions of the form result = exec.submit(aCallable).get();
因此,即使您使用后台线程,通过调用 get 也会阻塞您的主线程,直到后台线程完成您的任务。
为了避免 UI 垃圾,您应该使用回调。
我想通过 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 个像这样执行的方法 above.I 使用 Executor 服务 运行 callable
:
ExecutorService serviceExecutor = Executors.newSingleThreadExecutor();
我是我的 activity 我有一个菜单,然后单击菜单中的一个项目片段是 activity 中的一个事务。所有线程任务立即在 onViewCreated
片段中开始:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
presenter.getCis();
}
但是当我点击菜单项 UI
时,它变得很乱,直到所有任务都停止,然后交易停止。这不是我第一次遇到这个问题。每次我用callable和executor service我都不知道为什么UI是毛躁的!!!!
这是分析器:
Someone has some guidance for me!!? Please do not tell me to use asyncTask :-)
What is a read line?? In ui thread I just do transaction not execute long running task!!!
发生这种情况是因为您在 execute() 方法返回的未来调用 get()。根据文档,
If you would like to immediately block waiting for a task, you can use constructions of the form result = exec.submit(aCallable).get();
因此,即使您使用后台线程,通过调用 get 也会阻塞您的主线程,直到后台线程完成您的任务。
为了避免 UI 垃圾,您应该使用回调。