GPS Android中的LocationManager RequestLocationUpdate()

GPS Android中的LocationManager RequestLocationUpdate(),android,gps,looper,Android,Gps,Looper,我已经开发了一个应用程序作为服务来处理基本的HTTP请求。当手机收到HTTP Post请求(如:HTTP://IP:port/gps/on)时,应按如下方式向gps侦听器注册: lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,200,0,locationListener); 但是,由于此代码存在于处理程序中,我得到以下错误: 8.614: E/AndroidRuntime(21211): java.lang.RuntimeExc

我已经开发了一个应用程序作为服务来处理基本的HTTP请求。当手机收到HTTP Post请求(如:
HTTP://IP:port/gps/on
)时,应按如下方式向gps侦听器注册:

 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,200,0,locationListener); 
但是,由于此代码存在于处理程序中,我得到以下错误:

8.614: E/AndroidRuntime(21211): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.os.Handler.<init>(Handler.java:121)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$HttpFileHandler.registerGPS(ConnectService.java:4281)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$HttpFileHandler.handle(ConnectService.java:700)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at org.apache.http.protocol.HttpService.doService(HttpService.java:243)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:187)
06-18 12:34:58.614: E/AndroidRuntime(21211):    at com.example.devicecommunication.ConnectService$WorkerThread.run(ConnectService.java:4987) 
然后在您的服务类中使用:

private void LocationLog() {
        new LocationLog(context, latString, lngString).start();
        Log.d(latString, getClass().getSimpleName());
        Log.d(lngString, getClass().getSimpleName());
        retrieveUserId();
        sendData(user_id);
    }
然后在您的服务类中使用:

private void LocationLog() {
        new LocationLog(context, latString, lngString).start();
        Log.d(latString, getClass().getSimpleName());
        Log.d(lngString, getClass().getSimpleName());
        retrieveUserId();
        sendData(user_id);
    }

您得到的错误是因为您试图从需要主线程的后台线程运行某些内容。您提供的代码没有显示此线程的设置,但要将位置设置回UI/主线程,您应该能够使用runOnUiThread创建一个新的runnable,如下所示

private Runnable runnable = new Runnable() {
public void run() {  
    runOnUiThread(new Runnable() { 
        public void run(){ 
            //set up your listener here
        } 
    }); 
}

另一个评论是,您提到了GPS、UI/主线程操作和HTTP post。听起来这可以使用
AsyncTask
进行设置。我必须看到更多的代码,但如果你没有仔细研究,那可能会让你的生活更轻松

您遇到的错误是因为您试图从需要主线程的后台线程运行某些内容。您提供的代码没有显示此线程的设置,但要将位置设置回UI/主线程,您应该能够使用runOnUiThread创建一个新的runnable,如下所示

private Runnable runnable = new Runnable() {
public void run() {  
    runOnUiThread(new Runnable() { 
        public void run(){ 
            //set up your listener here
        } 
    }); 
}

另一个评论是,您提到了GPS、UI/主线程操作和HTTP post。听起来这可以使用
AsyncTask
进行设置。我必须看到更多的代码,但如果你没有仔细研究,那可能会让你的生活更轻松

在我的Post处理程序中,我向我的服务传递了一个额外的字符串,并再次启动了服务。在onStartCommand()中,我从intent中获取额外的命令,然后调用requestLocationUpdates(),因此这是在主线程上完成的。这就解决了我的要求。谢谢大家的帮助

在我的Post处理程序中,我向我的服务传递了一个额外的字符串,并再次启动了服务。在onStartCommand()中,我从intent中获取额外的命令,然后调用requestLocationUpdates(),因此这是在主线程上完成的。这就解决了我的要求。谢谢大家的帮助

你在哪里打这个电话?这通常只是意味着您需要使用UI线程,而不是在后台执行操作。需要查看更多代码,我猜您将requestLocationUpdates放在了处理程序或某种类型中的什么位置。显示更多代码。@Rarw您好,谢谢您的回复。我有一个线程,它创建了一个处理所有请求的类。在POST处理程序中,我需要向listener注册GPS。这是我的要求。你在哪里打电话?这通常只是意味着您需要使用UI线程,而不是在后台执行操作。需要查看更多代码,我猜您将requestLocationUpdates放在了处理程序或某种类型中的什么位置。显示更多代码。@Rarw您好,谢谢您的回复。我有一个线程,它创建了一个处理所有请求的类。在POST处理程序中,我需要向listener注册GPS。这是我的要求,谢谢。。这是否意味着您要将其带到UI线程?我应该在哪里退出这里的活套?谢谢。。这是否意味着您要将其带到UI线程?我应该在哪里退出此活套?我想我无法从服务中使用runOnUiThread()。请让我知道你的建议。我认为这个说法不是100%正确
runOnUiThread
是一种
活动
方法,因此我敢打赌,只要您将适当的上下文传递给您的服务,您就可以访问它。但是,如果我错了,以及如何从两者访问UI线程,我想我不能从服务中使用runOnUiThread()。请让我知道你的建议。我认为这个说法不是100%正确
runOnUiThread
是一种
活动
方法,因此我敢打赌,只要您将适当的上下文传递给您的服务,您就可以访问它。但是,如果我错了,如何从两者访问UI线程。