Как я могу получить доступ к переменной pin-кода, которую я получаю в функции onLocationResult () снаружи функции doInBackground ()? - PullRequest
1 голос
/ 05 марта 2020

Здесь я получаю пин-код пользователя после преобразования широты и долготы местоположения пользователя в гео-местоположение с помощью класса Geocoder. Я хочу получить доступ к пин-коду, который был сгенерирован в onLocationResult () для последующего использования в функции doInBackground (). Что я уже пробовал? 1. освобождает глобальную переменную в классе locationGet, затем присваивает ей значение в onLocationResult. 2. освобождает переменную в функции doInBackground (), но android studio предлагает преобразовать ее из строки в окончательный массив строк, но, опять же, я не получаю значение .

public class locationGet extends AsyncTask<Void, Void , Void> {
//background worker
String geoLocation;
ProgressDialog progressDialog;
    AlertDialog alertDialog;
    Context context;

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public locationGet(Context ctx) {
        context = ctx;
    }

    @Override
    protected void onPreExecute() {
        Log.d("test1", "onPreExecute");
        alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle("Error");
        progressDialog = new ProgressDialog(context);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Processing");
        showDialog();
    }
    private void showDialog() {
        Log.d("test1", "Progress bar is started");
        if (!progressDialog.isShowing()) {
            progressDialog.show();
        }
    }
    private void hideDialog() {
        Log.d("test1", "progress bar is stopped");
        if (progressDialog.isShowing())
            progressDialog.dismiss();
    }
    @Override
    protected Void doInBackground(Void... voids) {
        Log.d("test1", "doInBackground");
        LocationRequest locationRequest = new LocationRequest();
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(3000);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationServices.getFusedLocationProviderClient(context)
                .requestLocationUpdates(locationRequest, new LocationCallback() {
                    @Override
                    public void onLocationResult(LocationResult locationResult) {
                        super.onLocationResult(locationResult);
                        LocationServices.getFusedLocationProviderClient(context)
                                .removeLocationUpdates(this);
                        if (locationResult != null && locationResult.getLocations().size() > 0) {
                            int latestLocationIndex = locationResult.getLocations().size() - 1;
                            double latitude =
                                    locationResult.getLocations().get(latestLocationIndex).getLatitude();
                            double longitude =
                                    locationResult.getLocations().get(latestLocationIndex).getLongitude();
                            Location location = new Location("providerNA");
                            location.setLatitude(latitude);
                            location.setLongitude(longitude);
                            //till here we got latitude and longitude
                            //converting longitude and latitude into address
                            String errorMessage = "";
                            Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                            List<Address> addresses = null;
                            try {
                                addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                            } catch (Exception exception) {
                                errorMessage = exception.getMessage();
                            }
                            if (addresses == null || addresses.isEmpty()) {
                                Log.d("test1", errorMessage);
                            } else {
                                //we got the address
                                Address address = addresses.get(0);
                                String geoaddress=address.getAddressLine(0);
                                //finding pin code substring in address geoAddress String
                                int h = geoaddress.lastIndexOf(',');
                                String pincode=geoaddress.substring(h-5,h);
                                geoLocation = pincode;
                            }
                            hideDialog();
                        } else {
                            hideDialog();}
                    }
                }, Looper.getMainLooper());
        Log.d("test1","User's Pin Code = "+geoLocation); //but geoLocation is null though it has been initilised onLocationResult()
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        Log.d("test1","onPostExecute");
    }
}
...