函数返回值中的java帮助

函数返回值中的java帮助,java,database,function,interface,return-value,Java,Database,Function,Interface,Return Value,我需要在这里接口还是其他接口 如果是的话。。。我该怎么做? 因为它返回给我的值中没有任何内容,我希望它返回给我的值是我已经设置的值。谢谢 public double[] findbyidTodo(Context context , String loc) { double[] list = new double[]{}; new Thread(new Runnable() { @Override public void

我需要在这里接口还是其他接口

如果是的话。。。我该怎么做? 因为它返回给我的值中没有任何内容,我希望它返回给我的值是我已经设置的值。谢谢

public double[] findbyidTodo(Context context , String loc) {

    double[] list =  new double[]{};

        new Thread(new Runnable() {
            @Override
            public void run() {
                Todo todo = TodoRoomDatabase.getInstance(context)
                        .todoDao()
                        .findTodoById(loc);

                if (todo != null) {
                    list = new double[]{todo.getLatitude(), todo.getLongitude()};

                }

            }

        }).start();
        return list; // is return the null and not the new list

    }

这是因为异步

这是一个异步调用。这意味着它将开始,但代码不会等待它

Thread(new Runnable(){}
因此,如果您这样做:

double[] list =  new double[]{};

Thread(new Runnable(){}

return list;
Java不会等待线程完成并返回仍然为空的数组


看看这个问题:

这里的基本问题是,您试图同步返回异步计算的结果。这是不可能的。你不能归还你还没有的东西

那你该怎么办

简单的解决方案是同步执行数据库操作;i、 e.在当前线程中执行,而不是使用
新线程(…).start()
。只需将
run()
方法中的代码内联移动即可

(在代码的最终返回之前,通过在线程上调用
join()
可以获得相同的效果。但是,创建和销毁线程是没有充分理由的。这是低效的。)

但是,如果需要异步执行数据库操作,可以使用
CompletableFuture
(),如下所示:

public CompletableFuture<double[]> findbyidTodo(Context context , String loc) {

    final CompletableFuture<double[]> future =  new CompletableFuture<>();

    new Thread(new Runnable() {
        @Override
        public void run() {
            Todo todo = TodoRoomDatabase.getInstance(context)
                    .todoDao()
                    .findTodoById(loc);

            if (todo != null) {
                future.complete(new double[]{todo.getLatitude(), todo.getLongitude()});
            } else {
                future.complete(null);
            }

    }).start();
    return future;
}
public CompletableFuture findbyidTodo(上下文,字符串loc){
最终CompletableFuture=新的CompletableFuture();
新线程(newrunnable()){
@凌驾
公开募捐{
Todo Todo=TodoRoomDatabase.getInstance(上下文)
.todoDao()
.findTodoById(loc);
如果(todo!=null){
future.complete(新的双精度[]{todo.getLatitude(),todo.getLatitude()});
}否则{
future.complete(空);
}
}).start();
回归未来;
}
然后调用方可以执行以下操作:

CompletableFuture<double[]> future = findbyidTodo(...);

// Do some other stuff

double[] result = future.get();   // This blocks until the future has been completed.
CompletableFuture=findbyidTodo(…);
//做些别的事情
double[]result=future.get();//此块将一直阻止,直到future完成。
请注意,只有当数据库调用可能需要花费大量时间,并且在数据库调用过程中调用线程实际上有“其他事情”要做时,才值得这样做。如果没有…那么最好同步执行数据库操作


最后,如果要异步执行此操作,则使用线程池或执行器服务比为每个数据库操作创建新线程更有效。查看Java文档中的and。(创建和销毁线程相对昂贵。)

是这样一行:double[]result=future.get()//此功能将一直阻止,直到将来完成。它仅与future.join()一起工作;…ThanksNo.A
get
将隐式“加入”未来。您可以使用以下任一方法。