android - GPS 在异步任务中不工作

标签 android gps android-asynctask locationmanager

我已经实现了一个简单的 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)
        {
        }
    }

每次我运行它,它总是捕获异常。 GPS 权限在 list 中设置,我总是使用不同的应用程序来确保 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)

最佳答案

你不能那样做。 doInBackground() 返回后,线程立即终止。 GPS 监听器是一个 Handler,它需要一个 Looper 线程来运行。在 doInBackground() 开始时,您需要调用 Looper.prepare(),然后在结束时调用 Looper.loop()。它将永远循环,直到您在线程的 Looper 对象上调用 quit()

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

Java Can't create handler inside thread that has not called Looper.prepare()

关于android - GPS 在异步任务中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10523880/

相关文章:

java - 将 System.currentTimeMillis() 转换为当前可读时间

android - 将多个标志传递给android中的 Intent

android - 融合位置有时会停止

ios - 如何从照片中获取 GPS 数据

android - 如何在更改文本输入时使用异步任务执行搜索服务

android - 从静态类调用AsyncTask

android - 有谁知道在尝试使用 GSON 库时如何摆脱这个错误?

android - 如何在异步任务中调用 ksoap2?

c# - 如何通过 GPRS 向 GPS 追踪器(TK103、GT02、GT06、TK102 等)发送命令

java - Android Room 通用 DAO