处理程序在Android服务中陷入循环

时间:2015-07-06 23:07:33

标签: android gps android-service handler android-handler

我目前正在尝试使用服务通过GPS跟踪手机的应用。为了让GPS更新坐标,我需要在服务中使用一个处理程序。现在我遇到的问题是,当我执行Handler.post时,它会陷入循环,之后,它会完全忽略其余的服务代码。

当我调试时,我发现处理程序在方法之间交替传递消息,但没有任何有用的东西,它只是一遍又一遍地在相同方法之间循环。

这是我的服务代码,其中包含处理程序:

   public int onStartCommand(Intent intent, int flags, int startId)
        {
        ctx = ServicioDeFondo.this;
        mHandler = new Handler();


        reportarGPS = new Thread(new Runnable() { public void run()
        {
            try
            {
                while(true)
                {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            gps = new GPSTrack(ctx);
                            latitude = String.valueOf(gps.getLatitude());
                            longitude = String.valueOf(gps.getLongitude());
                        }
                    });

                    Thread.sleep(10000);

                    try {
                        new APISendClass().execute();
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        catch (Exception e)
        {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }
        } });



        reportarGPS.start();

        return START_STICKY;
    }

我整天都被困在这里,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

通过对问题的简要描述,很难理解预期的行为是什么。您没有解释GPSTrackAPISendClass做什么以及对象的类型。你说“它陷入了困境”。目前尚不清楚“它”是什么。使用while (true)语句,线程将循环直到取消。

请注意,Service方法(例如onStartCommand())在主线程上运行。这意味着您的Handler()构造函数将处理程序与主线程相关联。您发布到该处理程序的runnables在主线程上运行。那是你想要的吗?

另请注意,按stopSelf()Context.stopService()停止服务不会终止该线程。您需要使用代码在不再需要时取消该线程。这通常在onDestroy()中完成。

我拿了你发布的代码,用Log语句替换了对未知对象的调用并运行它。 logcat输出在“Get lat / long”和“APISendClass()”之间交替。

Handler mHandler;
Context ctx;
Thread reportGPS;

public int onStartCommand(Intent intent, int flags, int startId){
    Log.i("TEST", "onStartCommand()");

    ctx = this;

    // Service methods run on main thread.

    // Handler constructor with no args associates Handler
    // with current thread, which here is the main thread.
    mHandler = new Handler();

    reportGPS = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                while (true) {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            // This runnable is posted to the main thread.
                            // Is that what you intended?

                            //gps = new GPSTrack(ctx);
                            //latitude = String.valueOf(gps.getLatitude());
                            //longitude = String.valueOf(gps.getLongitude());
                            Log.i("TEST", "Get lat/long");
                        }
                    });
                    Thread.sleep(2000);

                    try {
                        //new APISendClass().execute();
                        Log.i("TEST", "APISendClass().execute()");
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    reportGPS.start();

    return START_STICKY;
}