編輯:我正在改寫這個問題,因爲我顯然不清楚。Android GPS超時
有時,Android手機上的GPS服務需要很長時間才能得到修復。有時候速度很快,有時需要幾個小時。我知道並接受這一點。
我有一個應用程序可以做很多事情。其中必須做的一件事就是允許用戶點擊一個按鈕將其當前座標發送到服務器。我需要的是當用戶點擊按鈕或之後在相當短的時間內電話的座標。
因爲我知道獲取GPS定位並不是即時的,我知道它可能需要幾分鐘或幾小時(在此期間用戶移動了很長距離),所以我需要爲此功能編碼超時。對於此功能,在用戶點擊按鈕後三分鐘(例如)上傳GPS位置是不可接受的。如果需要45秒,這很好,如果需要75秒,則不會。如果功能無法足夠快地獲取位置,則可以向用戶發出錯誤通知。
我需要一個功能'獲取GPS位置並將其發送到服務器,除非它需要超過一分鐘'。
我的原代碼如下。自發布以來,我改變了一些東西。我在onStartCommand()方法中添加了一個Timer。我啓動一個TimerTask,60秒後會調用我的stop()方法。在onLocationChanged()方法的開始處,我取消了TimerTask。
我的問題是:Timer方案是實現這個超時的好方法嗎?有沒有更好的辦法?
原題:
我正在寫一個Android應用程序,除其他事項外,需要發送當前的GPS座標到服務器,當用戶告訴它。從上下文菜單中,我運行下面的服務。該服務是一個LocationListener,並從LocationManager請求更新。當它獲取一個位置(onLocationChanged())時,它將自己作爲一個偵聽器並將座標發送到服務器。所有這些都在起作用。
但是,如果GPS座標不能快速提供,我的服務會持續運行,直到它獲得一些。它用一個進度對話框來阻止用戶界面,這很煩人。更糟糕的是,如果用戶在啓動該服務後已經移動,則第一個GPS座標可能是錯誤的,應用程序將向服務器發送錯誤的數據。
我需要服務超時。有沒有一個好的方法來做到這一點?我對線程不是很有經驗。我想我可以在onStartCommand()方法中運行一個Runnable,它會以某種方式倒數30秒,然後,如果還沒有GPS結果,請調用我的服務的stop()方法。這聽起來像是做到這一點的最佳方式嗎?
或者,是否有可能判斷GPS是否無法修復?我會怎麼做呢?
編輯:爲了進一步闡明,我正在尋找在放棄一段時間後「放棄」獲取位置的最佳方法。
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}
那麼你究竟做了什麼才能解決這個問題?我也有同樣的問題。 – sexitrainer 2011-02-22 20:39:08