LoginSignup
1
1

More than 1 year has passed since last update.

Robolectric の Illegal connection pointer 対策

Last updated at Posted at 2016-04-25

結構詰まってしまったのでメモ。

こんなエラー

バージョン 3.0 の場合

java.lang.NullPointerException
org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:70)
android.os.Looper.getMainLooper(Looper.java)
android.database.sqlite.SQLiteDatabase.isMainThread(SQLiteDatabase.java:391)
android.database.sqlite.SQLiteDatabase.getThreadDefaultConnectionFlags(SQLiteDatabase.java:381)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)

バージョンを 3.1-rc1 ( 2016-04-25 現在の最新 ) に上げても…

java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-5-thread-1,5,main] []
org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:467)
org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:373)
org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:64)
android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)

(´・ω:;.:...

回避策

普通に SQLite を利用した場合は問題なかったので、
どうやら別なスレッドから参照するとダメらしい…ということで

import java.util.concurrent.Executor
import scala.concurrent.ExecutionContext
implicit lazy val executor: ExecutionContext = {
  ExecutionContext fromExecutor new Executor {
    override def execute(command: Runnable) = command.run()
  }
}

テスト中だけスレッドを生成しない ExecutionContext に切り替えてしまえば無事に動いてくれる。

やった!

参考(にならなかった)リンク

ちなみにこれらは全てうまくいかなかった情報です

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1