Java 改造返回空对象的异步调用
我试图使用改型进行异步调用,但它返回null。我以前能够让同步调用正常工作,但我的异步版本无法工作 以下是我打电话的代码:Java 改造返回空对象的异步调用,java,android,asynchronous,null,retrofit,Java,Android,Asynchronous,Null,Retrofit,我试图使用改型进行异步调用,但它返回null。我以前能够让同步调用正常工作,但我的异步版本无法工作 以下是我打电话的代码: // Get the nodes from Heroku RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint( "http://myURL.com").build(); HerokuService herokuService = restAdapter.create(HerokuSe
// Get the nodes from Heroku
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(
"http://myURL.com").build();
HerokuService herokuService = restAdapter.create(HerokuService.class);
Callback<Node[]> callback = new Callback<Node[]>()
{
@Override
public void failure(RetrofitError err)
{
}
@Override
public void success(Node[] nodeArray, Response response)
{
tempNodes = nodeArray;
}
};
herokuService.nodes(callback);
// tempNodes is null here
我已经检查过是否有互联网连接,所以我确定这不是问题所在
我还尝试将tempNodes
设置为failure
中的一个伪值,但仍然为空。对我来说,这表明它正在达到成功
,但在那里它被设置为空
有没有想过为什么会发生这种情况,或者我可能会尝试解决它?谢谢
编辑:我尝试了阻止,以防我没有等待回调返回足够长的时间,如下所示:
CountDownLatch latch = new CountDownLatch(1); //Class variable
//...
Callback<Node[]> callback = new Callback<Node[]>()
{
@Override
public void failure(RetrofitError err)
{
latch.countDown();
}
@Override
public void success(Node[] nodeArray, Response response)
{
tempNodes = nodeArray;
latch.countDown();
}
};
herokuService.nodes(callback);
try
{
latch.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
CountDownLatch闩锁=新的CountDownLatch(1)//类变量
//...
Callback Callback=new Callback()
{
@凌驾
公共无效失败(错误错误错误)
{
倒计时();
}
@凌驾
public void成功(节点[]noderray,响应)
{
tempNodes=noderray;
倒计时();
}
};
节点(回调);
尝试
{
satch.wait();
}
捕捉(中断异常e)
{
e、 printStackTrace();
}
但现在它只是挂起,永远不会通过
latch.await()
。似乎回调永远不会返回?您在哪一点评估tempNodes?因为这是一个异步操作,所以您必须等待回调真正被调用。如果仍在等待结果,请忽略回调,并将nodes()
的返回值设置为Node[]
或List
计算出来。似乎我没有在访问tempNodes之前等待回调返回。我意识到我可以使用这里描述的倒计时锁存器进行阻塞:然后在回调完成后继续
我必须使用同步版本,然后在单独的线程上运行它。这是最终工作版本:
//Get the nodes from heroku, and block until we get them
final CountDownLatch latch = new CountDownLatch(1);
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
// Get the nodes from Heroku
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://safe-hollows-9286.herokuapp.com")
.build();
HerokuService herokuService = restAdapter.create(HerokuService.class);
tempNodes = herokuService.nodes();
}
catch (Exception e)
{
e.printStackTrace();
}
latch.countDown();
}
});
thread.start();
try
{
latch.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
我正在评估我在哪里留下了这样的评论。但我猜你是对的,回拨到那时还没有回来。有没有一种方法可以阻止它,直到它返回?而且,我已经按照您的建议尝试了一个同步调用,而且效果很好。我在这里特别尝试使用异步调用。使用信号量或其他同步机制。老实说,这会破坏异步回调的目的。是的,我知道这一点。现在,为了实现这个目的,我正在尝试异步实现:)请稍等。这仍然不起作用。现在,回调永远不会返回,并且永远阻塞。知道为什么回叫可能没有返回吗?
//Get the nodes from heroku, and block until we get them
final CountDownLatch latch = new CountDownLatch(1);
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
// Get the nodes from Heroku
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://safe-hollows-9286.herokuapp.com")
.build();
HerokuService herokuService = restAdapter.create(HerokuService.class);
tempNodes = herokuService.nodes();
}
catch (Exception e)
{
e.printStackTrace();
}
latch.countDown();
}
});
thread.start();
try
{
latch.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}