Android 在CompletableFuture中返回的读取值

Android 在CompletableFuture中返回的读取值,android,completable-future,Android,Completable Future,来自某个SDK的函数正在向我返回一个完整的未来。一旦达到该值,我如何正确读取该值 我的代码: CompletableFuture<Web3ClientVersion> web3clientCompletableFuture; web3clientCompletableFuture = web3jNode.web3ClientVersion().sendAsync(); CompletableFuture web3clientCompletableFuture; web3client

来自某个SDK的函数正在向我返回一个完整的未来。一旦达到该值,我如何正确读取该值

我的代码:

CompletableFuture<Web3ClientVersion> web3clientCompletableFuture;
web3clientCompletableFuture = web3jNode.web3ClientVersion().sendAsync();
CompletableFuture web3clientCompletableFuture;
web3clientCompletableFuture=web3jNode.web3ClientVersion().sendAsync();
sendAsync()代码(在SDK中):

public CompletableFuture-sendsync(){
返回web3jService.sendAsync(this,responseType);
}
我可以使用get()访问返回的数据,但这会使整个过程同步并阻塞UI

我已经检查了签名上的函数,比如:

thenappy(函数这里是一个完整的future函数。如果在处理future之后必须返回值,那么您希望使用thenappy(),这是对的。但是,如果您只是想处理future而不返回任何内容,那么您应该使用thenapport()和thenRun()。还有其他方法列出了示例

下面是一个简单返回integer类型的CompletableFuture的示例:

CompletableFuture<Integer> mynumber = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            mynumber = CompletableFuture.supplyAsync(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
                return 4 * 4;
            });
        }
CompletableFuture mynumber=null;
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.N){
mynumber=CompletableFuture.SupplySync(()->{
试一试{
时间单位。秒。睡眠(1);
}捕捉(中断异常e){
抛出新的非法状态异常(e);
}
返回4*4;
});
}
此处arg是上述步骤的结果(CompletableFuture),在您的情况下是从SDK接收的数据。您正在附加回调方法(thenApply())并执行您想对其执行的操作。根据您的实现,您可以附加多个thenApply().这里我调用一个方法,该方法将获取结果并使用它进行一些计算

        CompletableFuture<Integer> willdoStuff = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            willdoStuff = mynumber.thenApply(arg -> {
                compute(arg);
                return arg / 2;
            });
        }

public void compute(int someInt){
        Toast.makeText(getApplicationContext(), "The result of the computation is" + someInt, Toast.LENGTH_LONG).show();
}
CompletableFuture-willdoStuff=null;
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.N){
willdoStuff=mynumber.thenApply(arg->{
计算(arg);
返回arg/2;
});
}
公共void计算(int-someInt){
Toast.makeText(getApplicationContext(),“计算结果为”+someInt,Toast.LENGTH_LONG).show();
}
只需注释掉睡眠代码即可在主线程中执行此代码。
Lambda函数只是输入和输出,{}之前的参数是输入,{}中的语句,实际上是一个处理参数(输入)的函数。您可能想就此提出不同的问题。

谢谢分享。我以前检查过文档。如果您清楚这些概念,您介意分享一段代码片段,解释如何“读取数据”或“将数据传递给函数”吗在我的场景中,SDK在CompletableFuture上发送。我添加了一个示例。希望它很容易理解。@火星人我有一个类似的用例,但我的是尝试从数据库获取数据并将其传递到UI。我是CompletableFuture的新手,因为我正在尝试用.get()替换AsyncTask[也是ExecutorService.submit()]将CardView列表从房间数据库加载到用户界面。如果运气不好,请在此提供任何想法或想法:
CompletableFuture<Integer> mynumber = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            mynumber = CompletableFuture.supplyAsync(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
                return 4 * 4;
            });
        }
        CompletableFuture<Integer> willdoStuff = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            willdoStuff = mynumber.thenApply(arg -> {
                compute(arg);
                return arg / 2;
            });
        }

public void compute(int someInt){
        Toast.makeText(getApplicationContext(), "The result of the computation is" + someInt, Toast.LENGTH_LONG).show();
}