Android 如何使用AsyncTask获取位置

Android 如何使用AsyncTask获取位置,android,location,android-asynctask,Android,Location,Android Asynctask,我正在努力寻找解决这个问题的好办法。我制作了我的应用程序,以便它找到我的位置。这似乎过于复杂,但足够简单。不过,按照谷歌的建议,我现在尝试将此代码作为异步任务运行,这样就不会占用UI。然而,我甚至不知道如何编译代码,更不用说实际运行了。错误在于,当我引用locationManager以删除侦听器时,无法解决该问题。我试过使用这里发布的代码。然而,在这个例子中,currentLocation似乎并没有被引用到任何东西,我在试图解决这个问题时遇到了问题。我已经浪费了将近一整天的时间来解决这个问题,所

我正在努力寻找解决这个问题的好办法。我制作了我的应用程序,以便它找到我的位置。这似乎过于复杂,但足够简单。不过,按照谷歌的建议,我现在尝试将此代码作为异步任务运行,这样就不会占用UI。然而,我甚至不知道如何编译代码,更不用说实际运行了。错误在于,当我引用locationManager以删除侦听器时,无法解决该问题。我试过使用这里发布的代码。然而,在这个例子中,currentLocation似乎并没有被引用到任何东西,我在试图解决这个问题时遇到了问题。我已经浪费了将近一整天的时间来解决这个问题,所以如果有人能给我指出正确的方向,我将不胜感激

private class LocationControl extends AsyncTask<Context, Void, Location> {
    public Location alocation;
    private LocatoinManager locationManager;

    @Override
    public Location doInBackground(Context... params) {
         locationManager = (LocationManager) params[0].getSystemService(Context.LOCATION_SERVICE);        
          locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener);
        return alocation;
    }

    public LocationListener locationListener = new LocationListener() {

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

            public void onLocationChanged(android.location.Location mlocation) {
                saveLocation(mlocation);
                locationManager.removeUpdates(locationListener);
            }
    };  

    void saveLocation(android.location.Location location){
        alocation = location;   
    }

    @Override
    protected void onPostExecute(Location result) {
        useLocation(result);
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        dialog.show(WasserSportLotse.this, " ", "Finding location...");

        super.onPreExecute();
    }
}   
私有类LocationControl扩展了异步任务{
公共场所选址;
私人场所管理者场所管理者;
@凌驾
公共位置doInBackground(上下文…参数){
locationManager=(locationManager)参数[0]。getSystemService(Context.LOCATION\u服务);
locationManager.RequestLocationUpdate(locationManager.GPS\提供程序,0,0,locationListener);
返回位置;
}
public LocationListener LocationListener=new LocationListener(){
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){}
公共无效onProviderEnabled(字符串提供程序){}
公共无效onProviderDisabled(字符串提供程序){}
public void onLocation已更改(android.location.location mlocation){
保存位置(mlocation);
locationManager.RemoveUpdate(locationListener);
}
};  
void saveLocation(android.location.location){
位置=位置;
}
@凌驾
受保护的void onPostExecute(位置结果){
使用位置(结果);
super.onPostExecute(结果);
}
@凌驾
受保护的void onPreExecute(){
显示(wassersortlotse.this,“,“查找位置…”);
super.onPreExecute();
}
}   
所以我用你的建议修改了代码,现在它可以编译了。我已经更新了这里的代码来表示我正在运行的内容。当locationManager请求SlocationUpdate时,我收到一个运行时错误。这是航海日志。有什么想法吗

04-15 14:57:56.742: ERROR/AndroidRuntime(18328): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.lang.Thread.run(Thread.java:1060)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.os.Handler.<init>(Handler.java:121)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):     ... 4 more
04-15 14:58:23.451: ERROR/AndroidRuntime(18356): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.lang.Thread.run(Thread.java:1060)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.os.Handler.<init>(Handler.java:121)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):     ... 4 more
04-15 14:57:56.742:错误/AndroidRuntime(18328):未捕获处理程序:线程异步任务#1由于未捕获异常而退出
04-15 14:57:56.942:错误/AndroidRuntime(18328):java.lang.RuntimeException:执行doInBackground()时出错
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.lang.Thread.run(Thread.java:1060)处
04-15 14:57:56.942:错误/AndroidRuntime(18328):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于android.os.Handler.(Handler.java:121)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:128)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager$ListenerTransport。(LocationManager.java:126)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager.\u请求locationupdates(LocationManager.java:697)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager.RequestLocationUpdate(LocationManager.java:619)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于com.wassersortlotse.wassersortlotse$LocationControl.doInBackground(wassersortlotse.java:62)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于com.wassersortlotse.wassersortlotse$LocationControl.doInBackground(wassersortlotse.java:1)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:57:56.942:错误/AndroidRuntime(18328):。。。4更多
04-15 14:58:23.451:错误/AndroidRuntime(18356):未捕获处理程序:线程异步任务#1由于未捕获异常而退出
04-15 14:58:23.642:错误/AndroidRuntime(18356):java.lang.RuntimeException:执行doInBackground()时出错
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.lang.Thread.run(Thread.java:10)处
LocationManager locationManager = (LocationManager)params[0].getSystemService(Context.LOCATION_SERVICE);        
public class FastMainActivity extends Activity {

    Button searchBtn = null;
    Intent locatorService = null;
    AlertDialog alertDialog = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        searchBtn = (Button) findViewById(R.id.searchBtn);

        searchBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                if (!startService()) {
                    CreateAlert("Error!", "Service Cannot be started");
                } else {
                    Toast.makeText(FastMainActivity.this, "Service Started",
                            Toast.LENGTH_LONG).show();
                }

            }
        });

    }

    public boolean stopService() {
        if (this.locatorService != null) {
            this.locatorService = null;
        }
        return true;
    }

    public boolean startService() {
        try {
            // this.locatorService= new
            // Intent(FastMainActivity.this,LocatorService.class);
            // startService(this.locatorService);

            FetchCordinates fetchCordinates = new FetchCordinates();
            fetchCordinates.execute();
            return true;
        } catch (Exception error) {
            return false;
        }

    }

    public AlertDialog CreateAlert(String title, String message) {
        AlertDialog alert = new AlertDialog.Builder(this).create();

        alert.setTitle(title);

        alert.setMessage(message);

        return alert;

    }

    public class FetchCordinates extends AsyncTask<String, Integer, String> {
        ProgressDialog progDailog = null;

        public double lati = 0.0;
        public double longi = 0.0;

        public LocationManager mLocationManager;
        public VeggsterLocationListener mVeggsterLocationListener;

        @Override
        protected void onPreExecute() {
            mVeggsterLocationListener = new VeggsterLocationListener();
            mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 0, 0,
                    mVeggsterLocationListener);

            progDailog = new ProgressDialog(FastMainActivity.this);
            progDailog.setOnCancelListener(new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    FetchCordinates.this.cancel(true);
                }
            });
            progDailog.setMessage("Loading...");
            progDailog.setIndeterminate(true);
            progDailog.setCancelable(true);
            progDailog.show();

        }

        @Override
        protected void onCancelled(){
            System.out.println("Cancelled by user!");
            progDialog.dismiss();
            mLocationManager.removeUpdates(mVeggsterLocationListener);
        }

        @Override
        protected void onPostExecute(String result) {
            progDailog.dismiss();

            Toast.makeText(FastMainActivity.this,
                    "LATITUDE :" + lati + " LONGITUDE :" + longi,
                    Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            while (this.lati == 0.0) {

            }
            return null;
        }

        public class VeggsterLocationListener implements LocationListener {

            @Override
            public void onLocationChanged(Location location) {

                int lat = (int) location.getLatitude(); // * 1E6);
                int log = (int) location.getLongitude(); // * 1E6);
                int acc = (int) (location.getAccuracy());

                String info = location.getProvider();
                try {

                    // LocatorService.myLatitude=location.getLatitude();

                    // LocatorService.myLongitude=location.getLongitude();

                    lati = location.getLatitude();
                    longi = location.getLongitude();

                } catch (Exception e) {
                    // progDailog.dismiss();
                    // Toast.makeText(getApplicationContext(),"Unable to get Location"
                    // , Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onProviderDisabled(String provider) {
                Log.i("OnProviderDisabled", "OnProviderDisabled");
            }

            @Override
            public void onProviderEnabled(String provider) {
                Log.i("onProviderEnabled", "onProviderEnabled");
            }

            @Override
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
                Log.i("onStatusChanged", "onStatusChanged");

            }

        }

    }

}
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
            Log.w("DOCOMO-2","Network Connection failed");
        } 
        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);
                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);
                    if (locationManager != null) 
                    {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) 
                        {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }

                    }
                }
            }
        }
        locationManager=null;
        location=null;

    } 
    catch (Exception e) 
    {
        locationManager=null;
        location=null;
        e.printStackTrace();
    }
    return location;
}