2

Android で Google Play Services LocationClient を使用しています。場所と場所の更新を取得するのに問題はありません。ただし、アプリがバックグラウンドになると、アプリがアンドロイドによって停止され、次のエラーがスローされることがあります。

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:792)
at java.util.HashMap$KeyIterator.next(HashMap.java:819)
at com.google.android.gms.internal.l$a$a.onServiceDisconnected(Unknown Source)
at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1102)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1116)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)

このエラーを何度か取り除こうとしましたが、これが locationClient のコードが現在どのように機能しているかです:

@Override
public void onConnected(Bundle arg0) {
    counter = 0;
    if (getLocationClient().isConnected()) {
        getLocationClient().requestLocationUpdates(getLocationRequest(),
                providerListener);
        ;
        listen();
    } else if (!getLocationClient().isConnecting()){
        getLocationClient().connect();
    }
}

@Override
public void onDisconnected() {
    if(_locationClient!= null && !_locationClient.isConnected() && !_locationClient.isConnecting()) {
        try {
            connectLocationClient();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

メソッド getLocationClient および getLocationRequest は、このオブジェクトが null でないことを確認するためのものです。

private LocationClient getLocationClient() {
    if (_locationClient == null) {
        _locationClient = new LocationClient(context, this, this);
    }
    return _locationClient;
}

private LocationRequest getLocationRequest() {
    if (_locRequest == null) {
        _locRequest = new LocationRequest();
        _locRequest.setInterval(fixTime);
        _locRequest
                .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    }
    return _locRequest;
}

何が起こっている可能性がありますか?

ありがとう!

編集:

shr が指摘したように、onDisconnected で connect() を呼び出すことがおそらくこれを引き起こしているため、そこから削除しました。また、 onConnected() で requestLocationUpdates() を呼び出すと、問題が発生する可能性があるため、代わりに:

@Override
public void onConnected(Bundle arg0) {
   requestUpdates();
}
public void requestUpdates(){
   getLocationClient().requestLocationUpdates(getLocationRequest(),this);
}

@Override
public void onDisconnected() {
    //Use a handler instead to reconnect
}
4

1 に答える 1

2

Google 開発者コンソールのクラッシュ レポートで、大規模に展開されたアプリで同じ問題を発見しました。

onDisconnected()アプリの次のリリース スケジュールを待っている間は確認できませんでしたが、メソッドでクライアントを再接続しようとしたアプリが問題の原因であると思われます。

別のスタックオーバーフローの記事でHandlerは、(1) コールバック自体でメソッドを呼び出さないように使用するconnect()、(2) オブジェクトの再利用を避け、LocationClient古いオブジェクトを破棄して新しいオブジェクトを作成することを提案することで、この問題に関する優れたヒントを得ることができました。

これが役に立てば幸いです。

于 2013-12-05T08:32:24.050 に答える