0

我正在创建简单的 GPS 跟踪器。应用程序获取 gps 纬度/经度并将其发送到远程服务器上的 php。

@Override

public void onLocationChanged(Location loc)
{
   String infLat = Double.toString(loc.getLatitude());
   String infLon = Double.toString(loc.getLongitude());

   String Text = "My current location is: " +
     "Latitud = " + infLat +
     "Longitud = " + infLon;

   Toast.makeText( getApplicationContext(),
                   Text,
                   Toast.LENGTH_SHORT).show();

   uploadLoc(infLat, infLon); // calling method which sends location info
}

这是uploadLoc:

public void uploadLoc(String a, String b) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://link to script");

    try {

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("latitude", a));
        nameValuePairs.add(new BasicNameValuePair("longitude", b));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
        //
    } catch (IOException e) {
       //
    }
}

但我不断收到“应用程序已停止”。当我删除调用 uploadLoc 方法的行时,一切正常,并且 Toast 会随着位置的变化而更新。这里有什么问题?

4

1 回答 1

0

将您的 Http 帖子放在单独的线程中。

每次您尝试将您的位置发布到远程服务器时,都需要一些时间,最终可能会阻止您的onLocationChanged(Location loc)执行,下次 LocationListener 会调用它。

您可以尝试在每次收到位置更新时启动一个新线程,解决方案的问题是,根据您的位置更新接收频率,您最终可能会收到这么多线程。但是,如果您要求每小时更新一次位置,这可能不是一个坏主意。

或者,您可以将所有网络发布请求放在一个队列中并逐个处理。您甚至可以使用IntentService,也可以按照您的要求遵循其他设计模式套件。

关键是异步处理网络操作,因为这样的操作需要时间,在此期间它不会阻塞其他关键操作的执行。

于 2013-04-01T01:27:10.223 回答