この質問に答えるのは、壁にゼリーを釘付けにするようなものだとわかっているので、最初から深くお詫び申し上げます。できる限り詳細をお伝えしますが、多くはありません。
GPS を使用して xx 分ごとにユーザーの位置を取得する Blackberry アプリを開発しています (ユーザーの設定に応じて、15、30、または 60 になる可能性があります)。位置データを Web サービスに送信します。
正常に動作し、ユーザーの位置を正常に報告しますが、約 16 ~ 18 時間しか経過せず、その後、アプリが報告を停止し、ユーザー インターフェイスが機能しなくなります。エラーはスローされません。アプリが再起動されるまで、ユーザーの選択に応答しなくなります。
アプリのクラッシュがかなり予測可能であることは奇妙です-たとえば、8時間または10時間後にクラッシュすることはありません。常に16〜18時間のウィンドウで発生します。これは、クラッシュがGPS / WebServiceに関連していることを示唆しています報告。
基本的に、GPS/WebService の観点から見ると、アプリが WebService に 36 回 (30 分ごとに 18 時間) レポートを送信してから停止するように見えます。
誰かのアイデアのきっかけになることを期待して、コードの一部をここに投稿します。
private void updateGPSLocation(){
gps_interval_timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try{
getGPSLocation();
if(longitude != 0.0 && latitude != 0.0)
{
updateSubscriberLocation();
}
}catch(Exception ex){
}
}
}, 0, gps_interval);
}
前のコードで参照されている getGPSLocation() 呼び出しのコードは次のとおりです。
public void getGPSLocation(){
try{
//GPS thread
BlackBerryLocationProvider provider = (BlackBerryLocationProvider)LocationProvider.getInstance(new BlackBerryCriteria(GPSInfo.GPS_MODE_ASSIST));
//geolocation thread
BlackBerryLocationProvider provider1 = (BlackBerryLocationProvider)LocationProvider.getInstance(new BlackBerryCriteria(LocationInfo.GEOLOCATION_MODE_CELL));
if (provider != null){
provider.setLocationListener(new LocationListenerImpl(), _interval, 1, 1);
}
if(provider1 != null){
provider1.setLocationListener(new LocationListenerImpl(), _interval, 1, 1);
}
}
catch(Exception le){
}
}
繰り返しますが、申し訳ありませんが、これは自由回答式の質問であることは承知しています。Blackberry GPS に関する既知の問題はありますか? タイマー タスクを使用して間隔ベースのレポートをスケジュールしているため、スケジュールされたタイマー タスクをキューに入れることで、使用可能なすべてのメモリを使い果たしている可能性はありますか? cancel() メソッドを使用してタイマー タスクを明示的に破棄する必要がありますか? 何かのようなもの:
gps_interval_timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try{
getGPSLocation();
if(longitude != 0.0 && latitude != 0.0)
{
updateSubscriberLocation();
}
}catch(Exception ex){
}
finally
{
this.cancel();
}
}
}, 0, gps_interval);
どんな助けでも大歓迎です。ありがとうございました!
LocationListener コードで更新
private class LocationListenerImpl implements LocationListener {
public void locationUpdated(LocationProvider provider, Location location) {
if(location.isValid()) {
longitude = location.getQualifiedCoordinates().getLongitude();
latitude = location.getQualifiedCoordinates().getLatitude();
}
}
public void providerStateChanged(LocationProvider provider, int newState) {
}
}
getGPSLocation() で使用される _interval 変数は -1 に設定されています。