スキップしてメイン コンテンツに移動

Pepper SDK入門(7) UIスレッドとワーカースレッド

前回、アクションについて解説するなかで同期と非同期の区別が登場しました。今回はその同期と非同期について、UIスレッドとワーカースレッドの二つを主軸に見ていきます。

同期と非同期

Pepperではタブレットと本体でそれぞれ異なるプロセスが動いており、二つのCPU間にはUSBを経由したTCP/IPによる通信があります。 同期と非同期のどちらでアクションを実行するかは、実際に動かしてみた上での選択をお勧めします。

1.UIスレッド 

Androidシステムからのコールバック(onCreateやOnClickListenerなど)はUIスレッド上で動作します。
@Override
protected void onCreate(Bundle savedInstanceState) {
}
@Override
protected void onResume() {
}
タブレットからPepperに指示を出した場合、Pepperとタブレット間での通信が発生します。しかしUIスレッド上でのネットワーク通信は出来ないため、NetworkOnMainThreadExceptionがスローされてしまいます。そのため、UIスレッドからPepperに指示を出す際は非同期を使用するようにしてください。

実践:同期と非同期
同期:UIスレッドで呼ぶことができない
// UIスレッド
Say say = SayBuilder.with(qiContext)
        .withText("こんにちは")
        .build(); // NetworkOnMainThreadExceptionがスローされる
// UIスレッド
goTo.run(); // NetworkOnMainThreadExceptionがスローされる
非同期:UIスレッドで呼ぶことができる
// UIスレッド
Future<say> sayBuilding = SayBuilder.with(qiContext)
        .withText("こんにちは")
        .buildAsync(); 
// UIスレッド
goTo.async().run();

2.ワーカースレッド

続いて、ワーカースレッドについて見ていきましょう。Androidのワーカースレッドは独自で管理することも可能ですが、QiSDKのライブラリに任せることもできます。
QiSDKは複数の方法により、ワーカースレッドで処理を実行させることが可能です。
例① ロボットライフサイクル
@Override
public void onRobotFocusGained(QiContext qiContext) {
}
@Override
public void onRobotFocusLost() {
}
例② Futureチェーン
future.thenConsume(future -> {
});
例③ リスナー
qiContext.getHumanAwareness().addOnHumansAroundChangedListener(humans -> {
});
以上の例はすべて、UIスレッド上ではなくワーカースレッドで同期します。

実践:非同期が有効なシーン

2-1.アクションをキャンセルしたい場合
非同期でアクションを実行する必要があります。
Future<void>goToFuture = goTo.async().run();
...
goToFuture.requestCancellation();
2-2.複数のアクションを同時に実行したい場合
複数のアクションを、非同期で連続して実行する必要があります。
Future<void>sayFuture = say.async().run();
Future<void>goToFuture = goTo.async().run();
2-3.その他の場合
上記の2-1、2-2に該当しない場合は、同期か非同期のいずれかでアクションを実行します。
say.run();
もしくは
Future<void> sayFuture = say.async().run();

コメント

このブログの人気の投稿

Pepper SDK入門(1) Pepper SDKプラグインのインストール

Pepper SDK for Androidのサイトが黙々とアップデートされています。そろそろ感もありますので、Pepper SDK for Androidの公式サイトを読みつつ、理解したことをまとめていきたいと思います。 Android Studio対応版Pepperでは、AndroidのActivityからAPIを使用して、会話や動きを制御することが出来るようです。Pepper SDK for AndroidはAndroid Studioのプラグインであり、グラフィカルツール、Javaライブラリ、QiSDKを提供します。 Android Studio対応版Pepper向けのロボアプリを開発するため、以下に従って開発環境を整えましょう。 《OSバージョンの確認》 まずは、OSとバージョンの互換性を確認してください。 Linux … Ubuntu 16.04 Xenial Xerus - 64bits only Windows … Microsoft Windows 10 - 64bits only Mac … Mac OS X 10.12 Sierra 《Android Studioのインストール》 ロボアプリはPepperにビルトインされたAndroidのタブレット上で動くアプリであり、それによって開発を行うため、Android Studioのインストールが必要です。 <必要なもの> ・Android Studio Version 2.3かそれ以降 最新の安定したバージョンのインストールを推奨しています。 ・Java Development Kit (JDK) Android Studioの動作環境 Android Studioのインストールにあたっては、以下の公式インストールガイドに従ってください: http://developer.android.com/sdk/index.html 《Android SDKとビルドツールの入手》 Androidのアプリを開発するために、Android SDKとビルドツールのインストールが必要です。 <手順> ① Android Studioのツールバーから、 SDK Managerをクリックすると、SDK Managerが表示さ

Pepper SDK入門(3) はじめてのロボアプリ開発②

Androidプロジェクトの作成及びロボアプリの初期設定を行った前回に引き続き、Pepperのエミュレータと実機でアプリを実行するために必要な手順を確認していきます。 1.Pepperのエミュレータ  まずは、Pepperのエミュレータで動作確認するための方法についてです。 <手順> エミュレータボタン をクリックしてください。すると、ロボットエミュレータが表示されます。 プロジェクトにおける実行の構成でappが選択されているか を確認し、 選択されていない場合はそれを選択してください。 実行ボタン をクリックしてください。すると、Select Deployment Targetダイアログが表示されます。 ダイアログからPepperのエミュレータを選択してください。アプリがエミュレータにインストールされ、Robot Viewer上のバーチャルロボットで動作確認することが出来ます。 2.Pepperの実機  次に、Pepperの実機で動作確認するための方法を見ていきます。 <手順> Pepperのタブレットの設定を確認します。タブレットのホームにある設定アイコンをタップし、以下の設定を確認してください。 開発者モードが有効になっていること 開発者向けオプション、デバッグ、ADBも有効になっていること Android studioで、接続ボタン をクリックし、Robots Browserを表示してください。 Use fix portとUse fixed IP/hostnameにチェックを入れ、接続先のPepperのIPアドレスを入力してください。PepperのIPアドレスはタブレットの通知バーか、胸部ボタンを一回押すことで確認できます。 Selectボタンをクリックしてください。すると、セキュリティの警告が表示されます。 Pepperのパスワードを入力してください。初期パスワードはnaoです。変更している場合は管理者に確認して下さい。パスワード入力後にOKボタンをクリックすると、Robot Viewerが表示されます。 Pepperの実機に接続すると、同時にタブレットにもADB経由で接続されます。 プロジェクトにおける実行の構成でappが選択されてい

Pepper SDK入門(5) Robot focus と Robot lifecycle

Pepper SDK Plugin導入から始まり、簡単なロボアプリの開発を行ってきました。今回は、QiSDKの基本となるRobot focus と Robot lifecycleについて説明します。 1.フォーカスを理解する まずはロボットフォーカスについての簡単な説明です。 Activityがロボットのアクションを実行するためには、ロボットフォーカスが必要です。ロボットフォーカスはフォアグラウンドのActivityだけが保持することができ、ロボットフォーカスオーナーと呼ばれます。ロボットフォーカスはQiSDKに管理されており、Activityはいつでもロボットフォーカスを獲得したり喪失したりする可能性があります。  2.ロボットライフサイクル Pepper SDK入門(2) はじめてのロボアプリ開発①で登場したロボットライフサイクルについてです。 QiSDKがそれぞれのActivity用のロボットフォーカスを渡すために、RobotLifecycleCallbacksインタフェースを実装したオブジェクトが必要になります。以下はActivityにRobotLifecycleCallbacksインタフェースを実装した例です。 public class MyActivity extends RobotActivity implements RobotLifecycleCallbacks また、RobotLifecycleCallbacksオブジェクトにコールバックさせるにはonCreateメソッドでActivityとRobotLifecycleCallbacksオブジェクトをQiSDKに登録する必要があります。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); QiSDK.register(this, this); } その上で、onDestroyメソッドでの登録解除も必要です。  @Override protected void onDestroy() { QiSDK.unregister(this, this); super.onDestroy(