1

Google のアプリ内購入サンプル コードから次のコードを参照します。

/**
 * Asynchronous wrapper for inventory query. This will perform an inventory
 * query as described in {@link #queryInventory}, but will do so asynchronously
 * and call back the specified listener upon completion. This method is safe to
 * call from a UI thread.
 *
 * @param querySkuDetails as in {@link #queryInventory}
 * @param moreSkus as in {@link #queryInventory}
 * @param listener The listener to notify when the refresh operation completes.
 */
public void queryInventoryAsync(final boolean querySkuDetails,
                           final List<String> moreSkus,
                           final QueryInventoryFinishedListener listener) {
    final Handler handler = new Handler();
    checkSetupDone("queryInventory");
    flagStartAsync("refresh inventory");
    (new Thread(new Runnable() {
        public void run() {
            IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, "Inventory refresh successful.");
            Inventory inv = null;
            try {
                inv = queryInventory(querySkuDetails, moreSkus);
            }
            catch (IabException ex) {
                result = ex.getResult();
            }

            flagEndAsync();

            final IabResult result_f = result;
            final Inventory inv_f = inv;
            handler.post(new Runnable() {
                public void run() {
                    listener.onQueryInventoryFinished(result_f, inv_f);
                }
            });
        }
    })).start();
}

なぜコールバックHandlerを実行する必要があるのでしょうか? onQueryInventoryFinished新しく作成されたスレッドに関数を直接実行させることができないのはなぜですか?

            final IabResult result_f = result;
            final Inventory inv_f = inv;
            listener.onQueryInventoryFinished(result_f, inv_f);

onQueryInventoryFinishedよほどの理由がない限り、 UIスレッドで実行したい。しかし、それは正しくありません。コード サンプルはHandler、空のパラメーター コンストラクターを使用して作成しています。UIスレッドを使用して実行したい場合は、Handlerスルーを作成することを想定しています

Handler handler = new Handler(Looper.getMainLooper());

Handler上記の Google コード サンプルでコールバックを実行するために使用する特別な理由はありますか?

4

1 に答える 1

1

ハンドラーは、それが作成されたスレッドで、送信されたランナブルとメッセージを実行/処理します。Android でメッセージを渡すことにより、適切なスレッド間通信を行うための便利なツールです。

貼り付けたコードからは、このメソッドを実行するスレッドが明確ではありません。UI スレッドである可能性が非常に高く、その場合、作成された Handler は渡された Runnable を UI スレッドで実行します。それ以外の場合、開発者は、タスクが開始されたのと同じスレッドで非同期タスクが呼び出し元に終了状態を通知することを確認したかっただけだと思います。

于 2013-02-07T08:55:54.857 に答える