Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 改造返回空对象的异步调用_Java_Android_Asynchronous_Null_Retrofit - Fatal编程技术网

Java 改造返回空对象的异步调用

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

我试图使用改型进行异步调用,但它返回null。我以前能够让同步调用正常工作,但我的异步版本无法工作

以下是我打电话的代码:

// 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();
}