函数返回值中的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
将隐式“加入”未来。您可以使用以下任一方法。