2013-04-01 71 views
0

我正在創建簡單的GPS跟蹤器。應用程序獲取gps緯度/經度並將其發送到遠程服務器上的php。onLocationChange() - 不能發送帖子請求

@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更新爲位置更改。這裏有什麼可能是錯的?

+0

您確定沒有看到NetworkOnMainThreadException? – wtsang02

回答

0

把你的Http文章放在一個單獨的線程中。

每當您嘗試將您的位置發佈到遠程服務器時,它會花費一些時間,最終可能會阻止您的執行,下次它由LocationListener調用時。

您可以嘗試每次您收到位置更新時啓動一個新線程,並且根據您的位置更新接收頻率,您可能會遇到這麼多線程,解決方案會出現問題。但是,如果您每小時都要求更新位置,這可能不是一個壞主意。

或者,您可以將所有的網絡發佈請求放入一個隊列並逐一處理。您甚至可以使用IntentService或者也可以按照您的要求遵循其他設計模式套件。

關鍵是處理網絡操作異步作爲這樣的操作需要時間,在此期間它不會阻止其他鍵操作執行。