3

リモート サービスを使用した作業のほとんどすべての例には、そのようなコードが含まれています (これは Google IabHelper から取得したものです)。

 mServiceConn = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            logDebug("Billing service disconnected.");
            mService = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            logDebug("Billing service connected.");
            mService = getServiceFromBinder(service);
            ...
        }
    };

フィールド mService が常に null に設定されるのはなぜですか? onServiceConnected コールバックを無視するのは間違っていますか? 私の経験では、再接続は通常 1 ~ 2 秒後に発生します。フィールドが広く使用されているにもかかわらず、Google IABHelper は mService の null をチェックしません。また、私のユーザーの多くは、切断された場合に NPE を取得します。IabHelper にパッチを適用したい。問題はどのように..

フィールドmServiceが非同期メソッド内で使用されている場合、切断を処理する適切な方法は何ですか? onServiceDisconnected を無視して RemoteExceptions を取得するだけですか? 待機通知アプローチを考えましたが、再接続が行われるという保証はありません。どんなアイデアでも大歓迎です。

4

2 に答える 2

0

ダウンロードした Google の V3 ラッパー クラス IabHelper をリファクタリングして、null ポインター例外を取り除きました。プロジェクトでロック/同期の問題が発生していません。請求サービスへの接続が中断された場合を除き、並列処理はなく、オブジェクトを null に設定するのにそれほど時間はかかりません。

結果はgithubからダウンロードできます。

また、いくつかのメソッドの長さを自由に短縮して分割することもできました。私は、メソッド本体が画面やページを超えてはならないというアプローチのファンです。コードをより読みやすくするのに役立ちます。

于 2017-01-12T19:07:31.553 に答える