2016-06-04 4 views
0

Я знаю, что есть, вероятно, несколько способов сделать это, просто ищу наиболее эффективный и краткий способ идти об этом:Java Асинхронный Invoke в методе Ожидание возвращения

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 
} 
+1

Итак, в чем вопрос? – Antoniossss

+0

Почему вы запускаете асинхронный процесс, если хотите вернуть вычисленное значение? Вызывающему нужно будет ждать в любом случае. Похоже, вы хотите вернуть «Будущее» значение, вызывающий делает то, что он хочет с ним? – Tunaki

+0

результат должен быть объявлен окончательным для использования внутри объекта обратного вызова; так как я могу установить результат? – nuebKitsune

ответ

1

Из вашего кода - это изменено на лету, так что исправляйте ошибки, и все будет работать так, как вы ожидаете - вызывающий будет ждать до тех пор, пока сторонняя сторона не завершит обработку и не получит результат этого процесса:

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; 

} 
1

Прочитайте документацию AsyncTask. Ваша работа должна быть выполнена в методе doInBackground, и результат должен быть возвращен этим методом. Позже вы можете использовать метод get(Timeout) для получения возвращаемого значения. get будет даже блокировать, если вычисление в doInBackground еще не завершено для заданного количества времени.

Вы можете найти множество примеров использования async-задачи. Один из них находится в документации по API (ссылка выше)

+0

, поэтому мой вопрос к этому; Я буду запускать асинхронный вызов внутри и асинхронную задачу, какова моя задача async; ожидать, что результат больше не будет нулевым? Все еще проблема, как установить результат (объявление поля вне объекта задает его модификатор окончательному) – nuebKitsune

+0

Итак, у нас есть основной поток, AsyncTask1 - T1 и AsyncTask - T2. Основные запуски T1, T2 начинается с T2. Каким должен быть результат? Заканчивается ли T1 после запуска T2? Должен ли T1 ждать завершения T2? Должен ли MainThread ждать завершения T1? – Antoniossss

+0

AsyncProcess - это то, что я жду; но у него есть обратный вызов, когда он заканчивается, так что на самом деле то, что я жду, находится на обратном вызове, чтобы закончить. Итак, как мне сказать мой T1 ждать результата от обратного вызова? T1 запускает T2, T1 ждет T2 (но T2 завершает мгновенно, потому что он имеет обратный вызов) – nuebKitsune

Смежные вопросы