Android:后台服务中的计时器

Eam*_*orr 2 gps android timer

问候,

我正在尝试实现一个定时器,每10秒钟向我的服务器发送一次GPS坐标.

以下是我正在实施的服务的代码片段:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Timer timer=new Timer();
        TimerTask tt=new TimerTask(){
            @Override
            public void run() {
                Location loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                sendCoords(String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude()));
                Toast.LENGTH_SHORT).show();
                Log.i("EOH",String.valueOf(loc.getLatitude()));
            }
        };
        timer.schedule(tt,0,10000);

        return START_STICKY;
    }
Run Code Online (Sandbox Code Playgroud)

现在的问题是run()内的任何内容都会导致我的应用程序强制关闭.

这是LogCat转储:

12-28 18:44:18.284:ERROR/AndroidRuntime(6537):致命异常:Timer-0 12-28 18:44:18.284:ERROR/AndroidRuntime(6537):java.lang.RuntimeException:无法在里面创建处理程序没有调用Looper.prepare()的线程12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在android.os.Handler.(Handler.java:121)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在prestocab.driver.Background $ 2.(Background.java:83)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):at prestocab.driver.Background.sendCoords(Background.java: 83)12-28 18:44:18.284:ERROR/AndroidRuntime(6537):在prestocab.driver.Background $ 3.run(Background.java:114)12-28 18:44:18.284:ERROR/AndroidRuntime(6537): at java.util.Timer $ TimerImpl.run(Timer.java:289)12-28 18:44:18.554:ERROR/WindowManager(1310):return in RemoveWindowLocked

任何人都可以建议修复此问题吗?

我已尝试使用locationManager onLocationChanged()函数,但我无法将间隔设置为10秒.显然,指定的时间只是一个指导,操作系统决定什么是最好的.即使我将间隔设置为100秒,它也会每隔一秒钟给我一个位置.因此我使用计时器的原因.

我希望有人能提出一些建议.

提前致谢,

Com*_*are 7

我正在尝试实现一个定时器,每10秒钟向我的服务器发送一次GPS坐标.

这是不现实的.您可能根本没有得到任何修复.你可能不会得到修复,直到10秒钟.例如,我正在测试旨在帮助开发人员以更低的频率(例如,每小时一次)轮询位置更新的服务,并且即使从手机上也可以轻松地花费一分钟来修复坐在一个窗口.

以下是我正在实施的服务的代码片段:

这是有缺陷的.对于初学者来说,getLastKnownLocation()通常会null超出你的Timer/ TimerTask问题.

我希望有人能提出一些建议.

我将首先重新设计您的应用程序,以摆脱10秒概念作为一项艰难的要求.

然后,使用requestLocationUpdates().如果读数太多,请忽略您不想要的读数,不要将它们发送到服务器.当然,请在短时间内运行,并且仅基于积极的用户请求(例如,明确地运行您的应用程序),考虑到保持GPS无线电开启所涉及的电池消耗.

该文件requestLocationUpdates()在时间方面肯定令人困惑 - 我最近才意识到最短时间不一定得到尊重.