Subscribed unsubscribe Subscribe Subscribe

k-yamadaのブログ

プログラミングのメモ

NativeDriverで「Can't create handler inside thread」Exceptionが発生する

NativeDriverのテスト実行時に以下の例外が発生することがあります。

org.openqa.selenium.WebDriverException: Can't create handler inside thread that has not called Looper.prepare()

例外が発生する状況
以下にようにHandlerを定義しているActivityクラスを、

 // com.sample.demo.HandlerActivity.java
 private static Handler mHandler = new Handler();

NativeDriverのstartActivityで直接起動すると、上記の例外が発生します。

 // com.sample.demo.test.HandlerTest.java
driver.startActivity("com.sample.demo.HandlerActivity");

原因
NativeDriverのActivityを起動する部分のソースを見てみます。

  //com.google.android.testing.nativedriver.server.AndroidNativeDriver.java
  private void andActivity(URI dest) {
    Class<?> clazz;
    try {
      clazz = Class.forName(dest.getAuthority());
    } catch (ClassNotFoundException exception) {
      throw new WebDriverException(
          "The specified Activity class does not exist: " + dest.getAuthority(),
          exception);
    }
    ・・
  }

ActivityでHandlerを定義していると、上記のClass.forName(dest.getAuthority()) のところで、例外「java.lang.ExceptionInInitializerError」が発生しています。
Class.forNameメソッドは、引数で渡されたクラス(ここではcom.sample.demo.HandlerActivity)をロードしますが、このときにActivityの中でHandlerをstaticでインスタンス化していると、エラーになるようです。


解決方法
1.Handlerのインスタンス化をonCreate()内で行う

 // com.sample.demo.HandlerActivity.java
private static Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
  mHandler = new Handler();
}