如何在android中每5秒调用一次方法?

我正在使用一个应用程序,当我选择时,它必须每隔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 } } 

我遇到了完全相同的问题,定期发送位置。 我使用了一个处理程序及其postDelayed方法。

我的代码的定期调用部分如下所示:

 private final 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。

Ridcully是对的,可能没有理由每5秒发送一次当前位置。 这背后的理性是:

你真的只关心用户位置的两件事:

  1. 他们现在在哪里?

  2. 自从我找到第一个位置后,他们搬家了吗?

所以一旦你得到一个令人满意的初始位置,只要用户像这样移动就可以注册以获得回调:

 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秒才能运行,因此您可能只想在该间隔内运行它。 另外,仅供参考,这会杀死电池

查看AlarmManager类http://developer.android.com/reference/android/app/AlarmManager.html ,特别是setRepeating函数。 它会比你想要的复杂一点。

你可以使用一个Timer 。 但是我认为如果你只发送它的位置与你发送的最后一个相距一定距离会更好。 这样,您可以在不丢失任何信息的情况下发送更少的数据。