Вернуть значение из анонимного класса

Рейтинг: 2Ответов: 2Опубликовано: 27.04.2015

Как можно вернуть значение с метода который использует анонимный класс,

String driveId;
public String search(String title) {
    driveId = "";
    Query query = new Query.Builder().addFilter(Filters.eq(SearchableField.TITLE, title)).build();
    Drive.DriveApi.query(mGoogleApiClient, query).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
        @Override
        public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
            if (metadataBufferResult.getStatus().isSuccess()) {
                MetadataBuffer mdb = metadataBufferResult.getMetadataBuffer();
                for (Metadata metadata : mdb) {
                    if (metadata == null || !metadata.isDataValid() || metadata.isTrashed())
                        continue;                       
                    driveId = metadata.getDriveId().encodeToString();

                }
            }
        }
    });
    return driveId;
}

driveId возвращается пустой потому как он запускает в другом потоке, надо бы вернуть значение прямо из анонимного класса, как это можно сделать?

Ответы

▲ 2Принят

в <не анонимном классе>, куда нужно вернуть это значение определить метод

onDriveIdReceived(String driveId);

который вызвать из анонимного класса.

Или сделалть анонимный класс не анонимным.

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

▲ 3

Таким образом все равно не получится получить данные, так как как вы правильно сказали запрос к серверу осуществляется в другом потоке, и метод отрабатывается и отдает пустую строку в основном потоке быстрее, чем метод в другом потоке. Нужно организовать запрос таким образом, чтобы ваше приложение ждало пока запрос заберет из сервера данные, с помощью метода await(), и уже потом продолжит работу. Можете взглянуть реализацию здесь, в разделе Retrieving the result of a query.