Tunggu hingga lokasi GPS diambil untuk ListActivity

Saya sedang mengerjakan proyek Android di mana saya menggunakan data GPS untuk menampilkan Restoran terdekat. Di sisi server, saya telah menerapkan rumus Haversine untuk mendapatkan Restoran terdekat bergantung pada garis bujur dan garis lintang yang diambil. Namun, saya mengalami masalah tentang bagaimana cara memberi tahu kelas ListActivity saya untuk menunggu hingga lokasi GPS yang bukan nol diambil.

Saya memeriksa pertanyaan serupa, tetapi pertanyaan tersebut tidak memberikan bantuan apa pun untuk ListActivity. Bantuan apa pun akan menyenangkan. Terima kasih banyak.

DaftarKode Restoran :

public class RestaurantList extends ListActivity  {

    private ResponseEntity<RestRestaurant[]> responseEntity;

    private OrderAdapter m_adapter;

    private ArrayList<RestRestaurant> m_orders = null;

    GPSTracker gps;

    double longitude, latitude;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.restos);
        final RestTemplate restTemplate = StaticRestTemplate.getRest();
        final String restaurantList = StaticRestTemplate.baseURL+"getnearbyrestaurants";


        gps = new GPSTracker(RestaurantList.this);
        long TIMEOUT = 5000l; // 5 seconds
        long startTime = new Date().getTime();
        while (!gps.canGetLocation()) {
            gps.showSettingsAlert();
            long difference = new Date().getTime() - startTime;
            if (TIMEOUT > difference) break;

        }
        latitude = gps.getLatitude();
        longitude = gps.getLongitude();
        Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();

       /* if (gps.canGetLocation()) {
            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
            Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();

        } else {
            gps.showSettingsAlert();
        }*/



        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                HttpHeaders requestHeaders = new HttpHeaders();
                requestHeaders.add("Cookie", "JSESSIONID=" + StaticRestTemplate.jsessionid);
                requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));
                HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
                restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
                responseEntity = restTemplate.exchange(restaurantList+"/"+longitude+"/"+latitude,
                        HttpMethod.GET, requestEntity, RestRestaurant[].class);
            }
        });
        thread.start();
        ProgressDialog progress = new ProgressDialog(this);
        progress.setTitle("Loading");
        progress.setMessage("Wait while loading...");
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        progress.dismiss();
        RestRestaurant[] restRestaurantList = responseEntity.getBody();

        m_orders = new ArrayList<RestRestaurant>();
        this.m_adapter = new OrderAdapter(this, android.R.layout.simple_list_item_1, m_orders);

        for (RestRestaurant restRestaurant1 : restRestaurantList) {
            m_adapter.add(restRestaurant1);

        }

        setListAdapter(this.m_adapter);

Sekarang, seperti yang Anda lihat di thread, saya melewati garis bujur dan garis lintang. Saya tidak ingin meneruskan data bukan nol di sana.

Berikut adalah kode GPSTracker yang saya gunakan:

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");

        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

Apa yang ingin saya lakukan adalah meminta pengguna untuk mengaktifkan GPS dan kemudian hanya memanggil kode thread dan mengatur adaptor. Saya baru mengenal Android, harap pertimbangkan hal itu. Terima kasih.


person We are Borg    schedule 25.08.2015    source sumber
comment
kamu sudah memperbaikinya??   -  person Moulesh    schedule 17.01.2017


Jawaban (2)


Anda dapat menggunakan beberapa saat untuk menunggu hingga waktu habis atau mendapatkan lokasi

long TIMEOUT = 5000l; // 5 seconds

long startTime = new Date().getTime();
while (!gps.canGetLocation()) {
    gps.showSettingsAlert();
    long difference = new Date().getTime() - startTime;
    if (TIMEOUT > difference) break;
}

latitude = gps.getLatitude();
longitude = gps.getLongitude();

Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
person Jordi Castilla    schedule 25.08.2015
comment
Untuk batas waktu, sebaiknya saya menggunakan Thread.sleep(1000); atau sesuatu yang lain? - person We are Borg; 25.08.2015
comment
Saya akan merekomendasikan untuk membaca waktu sebelum sementara, menentukan konstanta untuk batas waktu, dan kemudian memeriksa setelah setiap iterasi.... - person Jordi Castilla; 25.08.2015
comment
Maaf, tidak berfungsi, permintaan masih diproses. Saya tidak tahu caranya. Saya sedang mengedit posting utama saya untuk menunjukkan seperti apa kodenya sekarang. - person We are Borg; 25.08.2015

Cara yang tepat untuk melakukannya adalah dengan mengimplementasikan onLocationChanged dengan benar - fungsi ini akan dipanggil ketika Anda memiliki lokasi. Setelah Anda mendapatkan lokasi dengan presisi yang baik, Anda dapat memberitahukan aktivitas utama Anda. Tentu saja, ini harus dijalankan di thread terpisah.

person SergeyA    schedule 25.08.2015
comment
Bisakah Anda memberi tahu saya perubahan yang diperlukan dalam kode saya untuk mencapainya. Saya telah mencoba banyak hal, tetapi sepertinya tidak ada yang berhasil. Terima kasih banyak. :-) - person We are Borg; 26.08.2015