Java [Android] Async Task richtig einsetzen

drunken.panda

Captain
Registriert
Juli 2008
Beiträge
3.890
Servus miteinander. Ich bin aktuell dabei ein kleines Programm zu schreiben bei dem ich mehrere Messungen über GPS von ein un der selben Stelle machen möchte. Anschließend soll nur die beste Position (Ausgegangen von der location.accuracy) in mein TextView Feld gelangen.

Nun bin ich bereits seit einiger Zeit am recherchieren, wie ich mit dem onLocationChanged Event besser umgehen soll. Auf der einen Seite würde ich gerne das Abarbeiten der Messungen im Hintergrund laufen lassen. Auf der anderen Seite habe ich eh einen Processdialog, der den Nutzer zum Warten bis zum Abschluss der Messungen auffordert.

Aktuell ist mein AsyncTask sehr unschön implementiert, da ich in der doInBackground Methode jeweils nur thread.sleep aufrufe, bis eventuell das onLocationChanged ein neues Event gesendet hat (also eine neue Position)

Hättet ihr einen Ansatz, wie ich den Code verbessern könnte oder ob ich sinnvollerweile Looper nutzen könnte und irgendwie die Loop Objekte in der onLocationChanged-Methode starte?

Hier mein Code, bei Fragen bitte melden.


Aktuell funktioniert alles so:

-> startGPSMesure Methode wird aufgerufen und ein Wert von 0-9 (Anzahl Messungen über einen Dialog mitgegeben) diese Methode ruft die getGPSPosition (AsyncTask) auf (die dann wiederum einen ProgressDialog startet (der den Nutzer zum Warten oder Abbrechen auffordert) und durch die thread sleep while schleife so lange läuft, bis die anzahlDerGPSMessungen auf 0 abgearbeitet wurde.

Aktuell wird auch nicht die beste Location zurückgegeben sondern nur im onPostExecute die letzt erfasste Location. Das ist aber vorerst egal.

Ab Zeile 106 wird es im Grunde erst interessant.

Code:
package com.example.bis;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TextView;





public class NewTreeViaGPSActivity extends Activity {


    TextView longitudeField;
    TextView latitudeField;
    TextView precisionField;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_tree_via_gps);


        longitudeField = (TextView) findViewById(R.id.longitude);
        latitudeField = (TextView) findViewById(R.id.latitude);
        precisionField = (TextView) findViewById(R.id.precision);


    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_new_tree_via_g, menu);
        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }


        return super.onOptionsItemSelected(item);
    }


    public void buttonClicked(View v) {
        startGPSMesure();
    }


    private void startGPSMesure() {


        final EditText input = new EditText(this);
        final NumberPicker np = new NumberPicker(getApplicationContext());
        np.setMaxValue(9);
        np.setMinValue(0);
        np.setBackgroundColor(Color.BLACK);
        new AlertDialog.Builder(this)
                .setTitle("GPS Messung starten...")
                .setMessage("Anzahl der GPS Messungen")
                .setView(np)
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        Editable value = input.getText();
                        getPosition gpspos = new getPosition(true, true, true, np.getValue());
                        gpspos.execute();
                    }
                }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                // Do nothing.
            }
        }).show();


   }



    private class getPosition extends AsyncTask<Void, Void, Location> implements LocationListener {


        ProgressDialog progressload = new ProgressDialog(NewTreeViaGPSActivity.this);
        private Location location;
        private LocationManager lm;
        private boolean use_gps;
        private boolean ist_gps_aktiv = false;
        private boolean zeige_progressbar;
        private boolean zeige_progresskill;
        private long minTime = 500;
        private float minDistance = 0;
        private int anzahlGPSMessungen;


         private getPosition(boolean benutzeGPS, boolean zeigeProgress, boolean zeigeAbbrechen, int anzahlGPSMessungen) {
            this.anzahlGPSMessungen = anzahlGPSMessungen;
            use_gps = benutzeGPS;
            zeige_progressbar = zeigeProgress;
            zeige_progresskill = zeigeAbbrechen;
        }


        protected void onPreExecute() {

            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            ist_gps_aktiv = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);


            if (use_gps && ist_gps_aktiv) {
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, this);
                progressload.setMessage("Suche Standortposition via GPS ...");
            } else {


                progressload.setMessage("GPS Standortsuche nicht in den Einstellungen aktiv");
                cancel(true);


            }

            progressload.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressload.setCancelable(false);


            if (zeige_progresskill) {
                System.out.println("Zeige Abbrechen-Button an ...");
                progressload.setButton(DialogInterface.BUTTON_NEGATIVE, "Abbrechen", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        killprogress();
                    }
                });
            } else {
                System.out.println("Zeige keinen Abbrechen-Button an ...");
            }


            if (zeige_progressbar) {
                progressload.show();
                System.out.println("Zeige ProgressDialog an ...");
            } else {
                System.out.println("Zeige keinen ProgressDialog an ...");
            }


        }


        private void killprogress() {
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            lm.removeUpdates(this);
         

        }

        @Override
        protected void onCancelled() {

            progressload.dismiss();

        }


        protected Location doInBackground(Void... params) {

            while (location == null || anzahlGPSMessungen > 0) {

                try {
                    Thread.sleep(100);
                } catch (Exception ex) {
                }

            }
            return location;

        }


        protected void onPostExecute(Location location) {
             
            progressload.dismiss();
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            lm.removeUpdates(this);


            latitudeField.setText(Double.toString(location.getLatitude()));
            longitudeField.setText(Double.toString(location.getLongitude()));
            precisionField.setText(Double.toString(location.getAccuracy()));

             
        }

        public void onLocationChanged(Location newLocation) {
            location = newLocation;
            anzahlGPSMessungen--;






        }


        public void onProviderDisabled(String provider) {
        }


        public void onProviderEnabled(String provider) {
        }

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

    }
}
 
Zuletzt bearbeitet:
Zurück
Oben