Как заставить асинхронную задачу ждать ответа? - PullRequest
0 голосов
/ 25 апреля 2019

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

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

WeatherClass.java

public class WeatherClass {

    private static double temp = 0.0;


    public static double getTemp(double latitude, double longitude, Context context){
        String OPEN_WEATHER_MAP_API = "xxxxxxxxx";
        new WeatherManager(OPEN_WEATHER_MAP_API).getFiveDayForecastByCoordinates(latitude,longitude,
                new WeatherManager.ForecastHandler() {
                    @Override
                    public void onReceivedForecast(WeatherManager manager, Forecast forecast) {
                        // Handle forecast

                        List<Double> list = new ArrayList<>();
                        for (int i = 0; i < 5; i++) {
                            long timestamp = forecast.getTimestampByIndex(i+3);
                            Weather weatherForTimestamp = forecast.getWeatherForTimestamp(timestamp);
                            Temperature tempMini = weatherForTimestamp.getTemperature().getMinimum();
                            double temperatureInCelcius = tempMini.getValue(TemperatureUnit.CELCIUS);
                            list.add(temperatureInCelcius);
                            Log.v("Weather", "" +weatherForTimestamp.getWind().getSpeed());
                            Log.v("Weather", "Température mini : " +  " "+ list.get(i));
                        }
                        int  minIndex = list.indexOf(Collections.min(list));
                        Log.v("Weather MINI", "Température mini : " + list.get(minIndex));
                        //Toast.makeText(context, "Température mini: " + list.get(minIndex), Toast.LENGTH_LONG).show();
                        temp =  list.get(minIndex);
                        Log.v("WeatherClass", temp + "");




                    }

                    @Override
                    public void onFailedToReceiveForecast(WeatherManager manager) {
                        Log.v("TAG",  " ERREUR");
                        temp = -1000000;

                    }
                }
        );
        return temp;
    }



}
0 голосов
/ 25 апреля 2019

Ваш код выполняется:

  1. Создайте запрос для получения данных.
  2. Return temp = 0.0
  3. Получите данные с сервера и обновите temp.

Таким образом, при запуске вашего кода будет возвращено значение = 0.0.

Чтобы исправить это, вы можете сделать:

  1. Создать новый интерфейс.IResult.java

    public interface IResult {
        void onResult(double temp);
    }
    
  2. Обновить метод getTemp:

     public static void getTemp(double latitude, double longitude, final IResult callback){
            String OPEN_WEATHER_MAP_API = "xxxxxxxxx";
            new WeatherManager(OPEN_WEATHER_MAP_API)
            .getFiveDayForecastByCoordinates(latitude,longitude,
                    new WeatherManager.ForecastHandler() {
                        @Override
                        public void onReceivedForecast(WeatherManager manager, Forecast forecast) {
                            // Handle forecast
    
                            List<Double> list = new ArrayList<>();
                            for (int i = 0; i < 5; i++) {
                                long timestamp = forecast.getTimestampByIndex(i+3);
                                Weather weatherForTimestamp = forecast.getWeatherForTimestamp(timestamp);
                                Temperature tempMini = weatherForTimestamp.getTemperature().getMinimum();
                                double temperatureInCelcius = tempMini.getValue(TemperatureUnit.CELCIUS);
                                list.add(temperatureInCelcius);
                                Log.v("Weather", "" +weatherForTimestamp.getWind().getSpeed());
                                Log.v("Weather", "Température mini : " +  " "+ list.get(i));
                            }
                            int  minIndex = list.indexOf(Collections.min(list));
                            Log.v("Weather MINI", "Température mini : " + list.get(minIndex));
                            //Toast.makeText(context, "Température mini: " + list.get(minIndex), Toast.LENGTH_LONG).show();
                            temp =  list.get(minIndex);
                            Log.v("WeatherClass", temp + "");
                            callback.onResult(temp);
    
    
    
                        }
    
                        @Override
                        public void onFailedToReceiveForecast(WeatherManager manager) {
                            Log.v("TAG",  " ERREUR");
                            temp = -1000000;
                            callback.onResult(temp);
    
                        }
                    }
            );
        }
    
  3. Использовать его

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        WeatherClass.getTemp(32.32, 322.3, new IResult() {
            @Override
            public void onResult(double temp) {
                //result here
            }
        });
    }
    

Обновление : поскольку при первом запуске этот метод возвращает 0.0 перед обновлением temp (шаг 2 возвращает temp, шаг 3 update temp), поэтому вы получите 0.0.При втором запуске этот метод будет возвращать результат первого запуска (поскольку он возвращает temp перед обновлением temp), поэтому вы можете думать, что это правильно (но не так, возвращаемое значение - это данные первого запуска).

0 голосов
/ 25 апреля 2019

Код продолжается нормально.Вы должны использовать обратный вызов для получения данных.Для более подробной информации, пожалуйста, прикрепите вашу функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...