ContextHubTransaction
ContextHubTransaction在ContextHubService的使用端定义,需要下面说的OnCompleteListener??
不是有IContextHubClientCallback函数吗?
* A class describing a request sent to the Context Hub Service.
*
* This object is generated as a result of an asynchronous request sent to the Context Hub
* through the ContextHubManager APIs.
* The caller can either retrieve the result
* synchronously through a blocking call ({@link #waitForResponse(long, TimeUnit)}) or
* asynchronously through a user-defined listener
* ({@link #setOnCompleteListener(OnCompleteListener, Executor)} )}).
transaction type
TYPE_LOAD_NANOAPP,
TYPE_UNLOAD_NANOAPP,
TYPE_ENABLE_NANOAPP,
TYPE_DISABLE_NANOAPP,
TYPE_QUERY_NANOAPPS
abstract class ContextHubServiceTransaction
An abstract class representing transactions requested to the Context Hub Service.
onTransact/onTransactionComplete/onQueryResponse
IContextHubTransactionCallback
/**
* An interface used by the Context Hub Service to invoke callbacks notifying the complete of a
* transaction. The callbacks are unique for each type of transaction, and the service is
* responsible for invoking the correct callback.
*
* @hide
*/
oneway interface IContextHubTransactionCallback {
// Callback to be invoked when a query request completes
void onQueryResponse(int result, in List<NanoAppState> nanoappList);
// Callback to be invoked when a non-query request completes
void onTransactionComplete(int result);
}
createLoadTransaction (需要传入IContextHubTransactionCallback?)
ContextHubServiceTransaction createLoadTransaction(
int contextHubId, NanoAppBinary nanoAppBinary,
IContextHubTransactionCallback onCompleteCallback) {
return new ContextHubServiceTransaction(
mNextAvailableId.getAndIncrement(), ContextHubTransaction.TYPE_LOAD_NANOAPP) {
@Override
/* package */ int onTransact() {
android.hardware.contexthub.V1_0.NanoAppBinary hidlNanoAppBinary =
ContextHubServiceUtil.createHidlNanoAppBinary(nanoAppBinary);
try {
return mContextHubProxy.loadNanoApp(
contextHubId, hidlNanoAppBinary, this.getTransactionId());
}
}
@Override
void onTransactionComplete(@ContextHubTransaction.Result int result) {
if (result == ContextHubTransaction.RESULT_SUCCESS) {
// NOTE: The legacy JNI code used to do a query right after a load success
// to synchronize the service cache. Instead store the binary that was
// requested to load to update the cache later without doing a query.
mNanoAppStateManager.addNanoAppInstance(
contextHubId, nanoAppBinary.getNanoAppId(),
nanoAppBinary.getNanoAppVersion());
}
try {
onCompleteCallback.onTransactionComplete(result);
if (result == ContextHubTransaction.RESULT_SUCCESS) {
mClientManager.onNanoAppLoaded(contextHubId, nanoAppBinary.getNanoAppId());
}
}
}
};
}
createQueryTransaction
ContextHubServiceTransaction createQueryTransaction(
int contextHubId, IContextHubTransactionCallback onCompleteCallback) {
return new ContextHubServiceTransaction(
mNextAvailableId.getAndIncrement(), ContextHubTransaction.TYPE_QUERY_NANOAPPS) {
@Override
/* package */ int onTransact() {
try {
return mContextHubProxy.queryApps(contextHubId);
}
}
@Override
/* package */ void onTransactionComplete(@ContextHubTransaction.Result int result) {
onQueryResponse(result, Collections.emptyList());
}
@Override
/* package */ void onQueryResponse(
@ContextHubTransaction.Result int result, List<NanoAppState> nanoAppStateList) {
try {
onCompleteCallback.onQueryResponse(result, nanoAppStateList);
}
}
};
}
onTransactionResponse、onQueryResponse、onHubReset
Handles a xxx response from a Context Hub.
synchronized void onTransactionResponse(int transactionId, int result) {
ContextHubServiceTransaction transaction = mTransactionQueue.peek();
transaction.onTransactionComplete(
(result == TransactionResult.SUCCESS) ?
ContextHubTransaction.RESULT_SUCCESS :
ContextHubTransaction.RESULT_FAILED_AT_HUB);
removeTransactionAndStartNext();
}
synchronized void onQueryResponse(List<NanoAppState> nanoAppStateList) {
transaction.onQueryResponse(ContextHubTransaction.RESULT_SUCCESS, nanoAppStateList);
removeTransactionAndStartNext();
}
synchronized void onHubReset() {
ContextHubServiceTransaction transaction = mTransactionQueue.peek();
removeTransactionAndStartNext();
}
/**
* Pops the front transaction from the queue and starts the next pending transaction request.
*
* Removing elements from the transaction queue must only be done through this method. When a
* pending transaction is removed, the timeout timer is cancelled and the transaction is marked
* complete.
*
* It is assumed that the transaction queue is non-empty when this method is invoked, and that
* the caller has obtained a lock on this ContextHubTransactionManager object.
*/
private void removeTransactionAndStartNext() {
mTimeoutFuture.cancel(false /* mayInterruptIfRunning */);
ContextHubServiceTransaction transaction = mTransactionQueue.remove();
transaction.setComplete();
if (!mTransactionQueue.isEmpty()) {
startNextTransaction();
}
}