1

我参考了谷歌的应用内购买示例代码中的以下代码

/**
 * 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在上面的谷歌代码示例中,有什么特别的理由可以用来执行回调吗?

4

1 回答 1

1

处理程序将在创建它的线程上运行/处理您发送给它的 Runnables 和消息。它是一个方便的工具,可以通过在 Android 上传递消息来进行适当的线程间通信。

从您粘贴的代码中,尚不清楚哪个线程执行此方法。它很可能是 UI 线程,在这种情况下,创建的 Handler 将在 UI 线程上执行传递的 Runnable。否则,我认为开发人员只想确保异步任务在启动任务的同一线程上通知调用者其完成状态。

于 2013-02-07T08:55:54.857 回答