diff options
Diffstat (limited to 'examples/ex3_async_event/src/main/java/com/google/android/mobly/snippet/example3/ExampleAsyncSnippet.java')
-rw-r--r-- | examples/ex3_async_event/src/main/java/com/google/android/mobly/snippet/example3/ExampleAsyncSnippet.java | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/examples/ex3_async_event/src/main/java/com/google/android/mobly/snippet/example3/ExampleAsyncSnippet.java b/examples/ex3_async_event/src/main/java/com/google/android/mobly/snippet/example3/ExampleAsyncSnippet.java new file mode 100644 index 0000000..a2b22fa --- /dev/null +++ b/examples/ex3_async_event/src/main/java/com/google/android/mobly/snippet/example3/ExampleAsyncSnippet.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.android.mobly.snippet.example3; + +import com.google.android.mobly.snippet.Snippet; +import com.google.android.mobly.snippet.event.EventCache; +import com.google.android.mobly.snippet.event.SnippetEvent; +import com.google.android.mobly.snippet.rpc.AsyncRpc; +import com.google.android.mobly.snippet.util.Log; + +public class ExampleAsyncSnippet implements Snippet { + + private final EventCache mEventCache = EventCache.getInstance(); + + /** + * This is a sample asynchronous task. + * + * In real world use cases, it can be a {@link android.content.BroadcastReceiver}, a Listener, + * or any other kind asynchronous callback class. + */ + public class AsyncTask implements Runnable { + + private final String mCallbackId; + private final int mSecretNumber; + + public AsyncTask(String callbackId, int secreteNumber) { + this.mCallbackId = callbackId; + this.mSecretNumber = secreteNumber; + } + + /** + * Sleeps for 10s then post a {@link SnippetEvent} with some data. + * + * If the sleep is interrupted, a {@link SnippetEvent} signaling failure will be posted instead. + */ + public void run() { + Log.d("Sleeping for 10s before posting an event."); + SnippetEvent event = new SnippetEvent(mCallbackId, "AsyncTaskResult"); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + event.getData().putBoolean("successful", false); + event.getData().putString("reason", "Sleep was interrupted."); + mEventCache.postEvent(event); + } + event.getData().putBoolean("successful", true); + event.getData().putString("exampleData", "Here's a simple event."); + event.getData().putInt("secretNumber", mSecretNumber); + mEventCache.postEvent(event); + } + } + + /** + * An Rpc method demonstrating the async event mechanism. + * + * This call returns immediately, but starts a task in a separate thread which will post an + * event 10s after the task was started. + * + * Expect to see an event on the client side that looks like: + * + * { + * 'callbackId': '2-1', + * 'name': 'AsyncTaskResult', + * 'time': 20460228696, + * 'data': { + * 'exampleData': "Here's a simple event.", + * 'successful': True, + * 'secretNumber': 12 + * } + * } + * + * @param callbackId The ID that should be used to tag {@link SnippetEvent} objects triggered by + * this method. + * @throws InterruptedException + */ + @AsyncRpc(description = "This triggers an async event and returns.") + public void tryEvent(String callbackId, int secretNumber) throws InterruptedException { + Runnable asyncTask = new AsyncTask(callbackId, secretNumber); + Thread thread = new Thread(asyncTask); + thread.start(); + } + @Override + public void shutdown() {} +} |