等待返回的方法中的Java异步调用

等待返回的方法中的Java异步调用,java,asynchronous,android-asynctask,Java,Asynchronous,Android Asynctask,我知道可能有几种方法可以做到这一点,只是寻找最有效、最简洁的方法: public Object giveMeNewObject() { final Object result = null; SomeApiClient.start(new Callback() { // starts an async process @Override public void onSuccess(Object somethingNew) {

我知道可能有几种方法可以做到这一点,只是寻找最有效、最简洁的方法:

public Object giveMeNewObject() {
    final Object result = null;
    SomeApiClient.start(new Callback() { // starts an async process
        @Override
        public void onSuccess(Object somethingNew) {
            result = somethingNew; //ERROR; can't set cause final
        }
    });
    return result; //result is null, cause Async already finished
}
阅读的文档。您的工作应该在
doInBackground
方法中完成,结果应该由该方法返回。稍后,您可以使用
get(Timeout)
方法检索返回的值<如果在给定的时间段内,
doInBackground
中的计算尚未完成,则code>get甚至会阻塞

您可以找到大量关于如何使用异步任务的示例。其中一个在API文档中(上面的链接)

请阅读的文档。您的工作应该在
doInBackground
方法中完成,结果应该由该方法返回。稍后,您可以使用
get(Timeout)
方法检索返回的值<如果在给定的时间段内,
doInBackground
中的计算尚未完成,则code>get甚至会阻塞


您可以找到大量关于如何使用异步任务的示例。其中一个在API文档中(上面的链接)

来自您的代码-这是动态修改的,以便更正错误,所有操作都将按照您的预期进行-调用方将等待第三方完成处理并获得该过程的结果:

public Object giveMeNewObject() {
    CountDownLatch latch=new CountDownLatch(1);
    Callback callback=new Callback() { 
      public sometype result=null;
        @Override
        public void onSuccess(Object somethingNew) {
            result = somethingNew; //ERROR; can't set cause final
            latch.countDown();
        }
    });
    SomeApiClient.start(callback);
    latch.await(sometimetowait);
    return callback.result;

}

从您的代码中-这是动态修改的,以便更正错误,所有操作都将按照您的预期进行-调用方将等待第三方完成处理并获得该过程的结果:

public Object giveMeNewObject() {
    CountDownLatch latch=new CountDownLatch(1);
    Callback callback=new Callback() { 
      public sometype result=null;
        @Override
        public void onSuccess(Object somethingNew) {
            result = somethingNew; //ERROR; can't set cause final
            latch.countDown();
        }
    });
    SomeApiClient.start(callback);
    latch.await(sometimetowait);
    return callback.result;

}


那么问题是什么呢?如果要返回计算值,为什么要启动异步进程?无论哪种方式,来电者都需要等待。听起来您想返回值的
未来
,调用者用它做它想做的事?结果必须声明为final,以便在回调对象中使用;那么我该如何设置结果呢?我确实想要一个未来的对象;但是问题不仅仅是让主线程等待,还包括从没有返回值的回调内部获取结果。那么问题是什么?如果要返回计算值,为什么要启动异步进程?无论哪种方式,来电者都需要等待。听起来您想返回值的
未来
,调用者用它做它想做的事?结果必须声明为final,以便在回调对象中使用;那么我该如何设置结果呢?我确实想要一个未来的对象;但是问题不仅仅是让主线程等待,还包括从没有返回的回调中获取结果,所以我的问题是;我将在内部和异步任务中启动一个异步调用,我的异步任务是什么;等待结果不再为空?还有一个问题,我如何设置结果(在对象外部声明一个字段将其修饰符设置为final),所以我们有了主线程、AsyncTask1-T1和AsyncTask-T2。主电源启动T1,T2启动T2。结果应该是什么?T1是否在T2启动后终止?T1应该等待T2完成吗?主线程应该等待T1完成吗?异步进程是我等待完成的;但是当它完成时有一个回调,所以我真正等待的是回调完成。那么,我如何告诉我的T1等待回调的结果呢?T1启动T2,T1在T2上等待(但T2立即完成,因为它有一个回调),如果您的后台任务调用另一个后台任务并等待它完成-这只是一个糟糕的设计。这可以通过单线程完成。在您的例子中,您使用池中的两个线程来完成一个作业。不要使用回调,只要阅读我给你的链接,使用
get
方法等待后台任务完成。听起来您使用的是
AsyncTask
,与未使用的方式类似。请阅读API文档以了解更多信息that@nuebKitsuneTL;博士,你最好编辑你的问题,因为你所要求的肯定不是你所描述的。是的,你们是不清楚的。所以我的问题是;我将在内部和异步任务中启动一个异步调用,我的异步任务是什么;等待结果不再为空?还有一个问题,我如何设置结果(在对象外部声明一个字段将其修饰符设置为final),所以我们有了主线程、AsyncTask1-T1和AsyncTask-T2。主电源启动T1,T2启动T2。结果应该是什么?T1是否在T2启动后终止?T1应该等待T2完成吗?主线程应该等待T1完成吗?异步进程是我等待完成的;但是当它完成时有一个回调,所以我真正等待的是回调完成。那么,我如何告诉我的T1等待回调的结果呢?T1启动T2,T1在T2上等待(但T2立即完成,因为它有一个回调),如果您的后台任务调用另一个后台任务并等待它完成-这只是一个糟糕的设计。这可以通过单线程完成。在您的例子中,您使用池中的两个线程来完成一个作业。不要使用回调,只要阅读我给你的链接,使用
get
方法等待后台任务完成。听起来您使用的是
AsyncTask
,与未使用的方式类似。请阅读API文档以了解更多信息that@nuebKitsuneTL;博士,你最好编辑你的问题,因为你所要求的肯定不是你所描述的。是的,你是不清楚的。