Присваивание значения переменным перед выполнением AsyncTask
Есть DownloadJSONTask, который наследуется от AsyncTask и делает JSON запрос, в который должны включаться данные о местоположении. Но execute() выполняется раньше, чем getCurrentLocation() получает значения и запрос отправляется с нулевыми координатами. Как сделать так, чтобы execute() "дожидалась" выполнения getCurrentLocation()?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvCity = findViewById(R.id.textViewCity);
tvDate = findViewById(R.id.textViewCurDate);
tvTemp = findViewById(R.id.textViewTemp);
tvMain = findViewById(R.id.textViewMain);
fusedLocationClient = LocationServices.getFusedLocationProviderClient(MainActivity.this);
getCurrentLocation();
cal = Calendar.getInstance();
language = Locale.getDefault().getLanguage();
DownloadJSONTask task = new DownloadJSONTask();
url = ("https://api.openweathermap.org/data/2.5/onecall?lat=" + lat + "&lon=" + lon + "&exclude=minutely,hourly&appid={API KEY}&units=metric&lang=" + language);
try {
task.execute(url).get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@SuppressLint("MissingPermission")
private void getCurrentLocation() {
Log.i("MyResult", "Getting location");
LocationManager locationManager =(LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
fusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
Location location = task.getResult();
if (location != null){
lat = location.getLatitude();
lon = location.getLongitude();
Log.i("MyResult", Double.toString(lat));
Log.i("MyResult", Double.toString(lon));
} else{
Log.i("MyResult", "Location is null");
}
}
});
}
}
Логи:
2020-10-15 16:33:24.397 22517-22517/com.example.cleanzyrebuild I/MyResult: Getting location
2020-10-15 16:33:25.511 22517-22517/com.example.cleanzyrebuild I/MyResult: {"lat":0,"lon":0,"timezone":"Etc/GMT","timezone_offset":0,"current"...
2020-10-15 16:33:25.535 22517-22517/com.example.cleanzyrebuild : сообщения от onPostExecute
2020-10-15 16:33:26.211 22517-22517/com.example.cleanzyrebuild I/MyResult: 48.806861877441406
2020-10-15 16:33:26.212 22517-22517/com.example.cleanzyrebuild I/MyResult: 62.28661346435547
Ответы (1 шт):
Как предложил KoVadim, решил отправить запрос из onComplete. Напрямую сделать не получилось поэтому написал метод executeJSON и запустил его из onComplete.
public void executeJSON(){
url = ("https://api.openweathermap.org/data/2.5/onecall?lat=" + lat + "&lon=" + lon + "&exclude=minutely,hourly&appid={API KEY}&units=metric&lang=" + language);
task.execute(url);
}