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 コード サンプルでコールバックを実行するために使用する特別な理由はありますか?