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