GPS 在异步任务中不起作用 [英] GPS not working in Async Task

查看:17
本文介绍了GPS 在异步任务中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have implemented a simple GPS program that fetches the co-ordinates and displays them on the screen. When I tried to improve on this design and implement an async task, the GPS doesn't seem to work for some reason or another. Is there some issue with regards to using async task with GPS? Here is my code:

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 权限在清单中设置,我总是使用不同的应用程序来确保 GPS 连接在线,因此我消除了这些潜在错误.老实说,我想不出其他任何东西,如果没有异步任务,它可以完美运行!非常感谢任何帮助,谢谢!

Each time I run it, it always catches an exception. The GPS permissions are set in the manifest and I'm always using a different application to ensure that a GPS connection is online so I eliminated those as potential errors. Honestly I can't think of anything else, without the async task it works perfectly! Any help is much appreciated, thanks!

已编辑我的异常日志:

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().

You can't do that. The thread dies as soon as doInBackground() returns. The GPS listener is a Handler which requires a Looper thread to operate. At the beginning of doInBackground() you need to call Looper.prepare() then at the end call Looper.loop(). It will loop forever until you call quit() on the thread's Looper object.

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

AsyncTask is really designed for one-shot temporary threads though, so I'd use a normal thread for this. Although, there's no reason you couldn't I suppose. You just have to make 100% sure that you end the loop or it will run forever even after the user closes the app.

Java无法在未调用 Looper.prepare() 的线程内创建处理程序

这篇关于GPS 在异步任务中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆