我目前正在尝试使用服务通过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;
}
我整天都被困在这里,非常感谢任何帮助!
答案 0 :(得分:0)
通过对问题的简要描述,很难理解预期的行为是什么。您没有解释GPSTrack
和APISendClass
做什么以及对象的类型。你说“它陷入了困境”。目前尚不清楚“它”是什么。使用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;
}