Многопоточность: получение нескольких мест одновременно с использованием списка идентификаторов мест с помощью API Google - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть список идентификаторов мест, хранящихся в моем приложении для Android.Я сделал это согласно документации Google по хранению.Теперь я хотел бы получить их данные о месте при загрузке моего приложения.Есть ли способ загрузить их через многопоточность с помощью API задач и задач.Я пытался поэкспериментировать с ними, а также с Executor и FutureTask, но у меня ничего не получилось.

Вот мой тестовый код:

public class GetPlaces implements Callable {

private String placeId;
private PlacesClient placesClient;

public GetPlaces(PlacesClient placesClient, String placeId) {
    this.placeId = placeId;
    this.placesClient = placesClient;
}

@Override
public Object call() throws Exception {

    String placeId = this.placeId;

    // Specify the fields to return.
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ADDRESS);

    // Construct a request object, passing the place ID and fields array.
    FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields)
            .build();

    // create a FetchPlaceResponse task
    Task<FetchPlaceResponse> task = placesClient.fetchPlace(request);

    // Get the address and return value
    return task;
}
}

Вот мойкод в onCreate ()

    List<String> address = new ArrayList<>();

    // Initialize Places.
    Places.initialize(getApplicationContext(), getString(R.string.app_google_api_key));
    // Create a new Places client instance.
    PlacesClient placesClient = Places.createClient(this);

    // Create a new ExecutorService with cached threadpool
    ExecutorService executor = Executors.newCachedThreadPool();

    // Create list to store the futuretasks
    List<Task<FetchPlaceResponse>> taskList = new ArrayList<>();

    for (int counter = 0; counter < list.size(); counter++) {

        Task<FetchPlaceResponse> task = Tasks.call(executor, new GetPlaces(placesClient, PlaceIdList.get(counter));
        taskList.add(task);

    }

    Task<List<Task<FetchPlaceResponse>>> taskResults = Tasks.whenAllSuccess(taskList);

    List<Task<FetchPlaceResponse>> results = new ArrayList<>();

    if (taskResults.isComplete()) {
        results = taskResults.getResult();
    }

    for (int i = 0; i < results.size(); i++) {

        FetchPlaceResponse response = results.get(i).getResult();
        address.add(response.getPlace().getAddress());
    }


    // Shutdown the ExecutorService
    executor.shutdown();
...