Android GPS在异步任务中不工作

Android GPS在异步任务中不工作,android,gps,android-asynctask,locationmanager,Android,Gps,Android Asynctask,Locationmanager,我已经实现了一个简单的GPS程序,可以获取坐标并在屏幕上显示。当我试图改进这个设计并实现一个异步任务时,由于某种原因GPS似乎无法工作。在GPS中使用异步任务是否存在一些问题?这是我的密码: private class DownloadTask extends AsyncTask<String, Void, Object> { protected Object doInBackground(String... args) { Log.i("My

我已经实现了一个简单的GPS程序,可以获取坐标并在屏幕上显示。当我试图改进这个设计并实现一个异步任务时,由于某种原因GPS似乎无法工作。在GPS中使用异步任务是否存在一些问题?这是我的密码:

private class DownloadTask extends AsyncTask<String, Void, Object> {
        protected Object doInBackground(String... args) {
            Log.i("MyApp", "Background thread starting");

            LocationManager mLocationManager;
            Gpslistener Gpslistener;

            Gpslistener = new Gpslistener();

            try{

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

               mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,Gpslistener);

            }catch (Exception e) {

                test_gps = true;
           }


        return null;
    }

    protected void onPostExecute(Object result) {

        if(test_gps == true){
            if (ParkingActivity.this.progressDialog != null) {
                ParkingActivity.this.progressDialog.dismiss();
            }               
            AlertMessage("GPS Error", "Unable to get location");
        }



public class Gpslistener implements LocationListener
{
        @Override
        public void onLocationChanged(Location loc)
        {
            loc.getLatitude();
            loc.getLongitude();
        }

        @Override
        public void onProviderDisabled(String provider)
        {       
        }

        @Override
        public void onProviderEnabled(String provider)
        {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
        }
    }
私有类下载任务扩展了异步任务{
受保护对象doInBackground(字符串…参数){
Log.i(“MyApp”,“后台线程启动”);
地点经理M地点经理;
Gpslistener-Gpslistener;
Gpslistener=新的Gpslistener();
试一试{
mLocationManager=(LocationManager)getSystemService(Context.LOCATION\u服务);
mlLocationManager.RequestLocationUpdate(LocationManager.GPS\U提供程序,0,0,Gpslistener);
}捕获(例外e){
测试_gps=真;
}
返回null;
}
受保护的void onPostExecute(对象结果){
如果(测试值=真){
if(ParkingActivity.this.progressDialog!=null){
ParkingActivity.this.progressDialog.Disclose();
}               
AlertMessage(“GPS错误”,“无法获取位置”);
}
公共类Gpslistener实现LocationListener
{
@凌驾
位置更改后的公共无效(位置loc)
{
loc.getLatitude();
loc.getLongitude();
}
@凌驾
公共无效onProviderDisabled(字符串提供程序)
{       
}
@凌驾
公共无效onProviderEnabled(字符串提供程序)
{
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra)
{
}
}
每次我运行它时,它都会捕获一个异常。GPS权限在清单中设置,我总是使用不同的应用程序来确保GPS连接处于联机状态,因此我消除了这些潜在错误。老实说,如果没有异步任务,我想不出其他任何东西,它工作得非常完美!非常感谢您的帮助,谢谢!

编辑 我的例外日志:

05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-09 22:56:20.199: E/EXCEPTION:(8874): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.os.Handler.<init>(Handler.java:121)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:173)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:173)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:579)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:163)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:1)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-09 22:56:20.199: E/EXCEPTION:(8874):     at java.lang.Thread.run(Thread.java:1019)
05-09 22:56:20.199:E/EXCEPTION:(8874):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-09 22:56:20.199:E/EXCEPTION:(8874):java.lang.RuntimeException:无法在尚未调用Looper.prepare()的线程内创建处理程序
05-09 22:56:20.199:E/异常:(8874):在android.os.Handler.(Handler.java:121)
05-09 22:56:20.199:E/例外:(8874):在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:173)
05-09 22:56:20.199:E/例外:(8874):在android.location.LocationManager$ListenerTransport。(LocationManager.java:173)
05-09 22:56:20.199:E/异常:(8874):在android.location.LocationManager.\u请求locationupdates(LocationManager.java:579)
05-09 22:56:20.199:E/异常:(8874):在android.location.LocationManager.RequestLocationUpdate(LocationManager.java:446)
05-09 22:56:20.199:E/异常:(8874):在stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:163)
05-09 22:56:20.199:E/异常:(8874):在stefan.testservice.ParkingActivity$DownloadTask.doInBackground(ParkingActivity.java:1)
05-09 22:56:20.199:E/例外:(8874):在android.os.AsyncTask$2.call(AsyncTask.java:185)
05-09 22:56:20.199:E/异常:(8874):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-09 22:56:20.199:E/EXCEPTION:(8874):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-09 22:56:20.199:E/异常:(8874):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-09 22:56:20.199:E/异常:(8874):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-09 22:56:20.199:E/异常:(8874):在java.lang.Thread.run(Thread.java:1019)

与其他许多事情一样,gps侦听器只能由循环线程(如ui线程)进行侦听。最简单的方法是通过ui线程进行侦听

此外,gps侦听器也没有这样命名。只有当它得到一个位置(这可能需要时间)时,它才会调用方法“onLocationChanged”。
对此,您不需要使用asyncTask,因为对“RequestLocationUpdate”的所有调用都是异步的…

与其他许多事情一样,gps侦听器只能由循环线程(如ui线程)侦听。最简单的方法是通过ui线程对其进行侦听

此外,gps侦听器也没有这样命名。只有当它得到一个位置(这可能需要时间)时,它才会调用方法“onLocationChanged”。
对此,您不需要使用asyncTask,因为对“RequestLocationUpdate”的所有调用都是异步的…

您不能这样做。只要
doInBackground()
返回,线程就会死亡。GPS侦听器是一个处理程序,需要一个
循环器
线程来操作。在
doInBackground()的开头
您需要调用
Looper.prepare()
然后在最后调用
Looper.loop()
。它将永远循环,直到您在线程的
Looper
对象上调用
quit()

AsyncTask
实际上是为一次性临时线程设计的,所以我会使用普通线程。不过,我想你没有理由不这样做。你只需100%确保结束循环,否则即使用户关闭应用程序,它也会永远运行


你不能这样做。线程在
doInBackground()
返回后立即死亡。GPS侦听器是一个处理程序,需要一个
Looper
线程来操作。在
doInBackground()
开始时,你需要调用
Looper.prepare()
,然后在结束时调用
Looper.loop()
。它将
mLocationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
Looper.prepare();
Looper.loop();
if(mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){    
  mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_MINIMUM_TIME, GPS_MINIMUM_DISTANCE, MyFragment.this);
}
Looper.myLooper().quit();