我正在使用一个应用程序,当我选择时,它必须每隔5秒向服务器发送一个GPS位置(自动发送按钮)。我是android的新手,所以我不知道如何制作开/关按钮,如何在按钮打开时调用每5秒发送一次数据的方法。
必须每5秒调用一次的方法:
public void postData() throws ClientProtocolException, IOException, Exception {
String longitude="UK";
String latitude="UK";
String altitiude="UK";
String time="";
String speed="";
getCurrentLocation(); // gets the current location and update mobileLocation variables
if (mobileLocation != null) {
locManager.removeUpdates(locListener); // This needs to stop getting the location data and save the battery power.
longitude = ""+mobileLocation.getLongitude();
latitude = "" + mobileLocation.getLatitude();
altitiude = "" + mobileLocation.getAltitude();
String accuracy = "Accuracy" + mobileLocation.getAccuracy();
time = "" + mobileLocation.getTime();
speed =""+ (int)(4*mobileLocation.getSpeed());
editTextShowLocation.setText(longitude + "\n" + latitude + "\n"
+ altitiude + "\n" + accuracy + "\n" + time+ "\n" + speed);
} else {
editTextShowLocation.setText("Sorry, location is not determined");
}
String url = "http://www.itrack.somee.com/post.aspx?id="+"f1"+"&long="+longitude+"&lat="+latitude+"&alt="+altitiude+"&speed="+speed;
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
答案 0 :(得分:12)
我遇到了完全相同的问题,定期发送位置。我使用了一个处理程序及其postDelayed
方法。
我的代码的定期调用部分如下所示:
private final int FIVE_SECONDS = 5000;
public void scheduleSendLocation() {
handler.postDelayed(new Runnable() {
public void run() {
sendLocation(); // this method will contain your almost-finished HTTP calls
handler.postDelayed(this, FIVE_SECONDS);
}
}, FIVE_SECONDS);
}
然后,当您想要开始期间来电时,只需拨打scheduleSendLocation
即可。
答案 1 :(得分:1)
Ridcully是对的,可能没有理由每5秒发送一次当前位置。这背后的理性是:
您真的只关心用户位置的两件事:
他们现在在哪里?
自从我找到第一个位置后,他们搬了吗?
因此,一旦您获得了满意的初始位置,只要用户像这样移动,您就可以注册以获得回调:
private LocationListener mLocationListener;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location location) {
updateLocation(location);
}
@Override
public void onStatusChanged(final String provider,
final int status, final Bundle extras) {
}
@Override
public void onProviderEnabled(final String provider) {
}
@Override
public void onProviderDisabled(final String provider) {
}
};
}
话虽这么说,你显然可以做其他人所说的话,并且每5秒运行一次计时器。问题是,大多数好的位置需要10-20秒才能运行,因此您可能只想在该间隔内运行它。另外,仅供参考,这会杀死电池
答案 2 :(得分:0)
查看AlarmManager类http://developer.android.com/reference/android/app/AlarmManager.html,特别是setRepeating函数。它会比你想要的复杂一点。
答案 3 :(得分:0)
您可以使用Timer
。但是我认为如果你只发送它的位置与你发送的最后一个相比有一定距离会更好。这样,您可以在不丢失任何信息的情况下发送更少的数据。