Scalaといっしょ

ScalaでAndroidとiOSとPlayFrameworkを書いてます。

Scala on Android with Dipatch

Scala on AndroidでDipatchを使う方法

Androidで普通にDipatch使おうとすると、下記の例外を投げて通信してくれません。

W/dalvikvm(18092): VFY: unable to resolve exception class 431 (Ljavax/naming/AuthenticationException;)
W/dalvikvm(18092): VFY: unable to find exception handler at addr 0x5f
W/dalvikvm(18092): VFY:  rejected Lcom/ning/http/client/providers/jdk/JDKAsyncHttpProvider;.createUrlConnection (Lcom/ning/http/client/Request;)Ljava/net/HttpURLConnection;
W/dalvikvm(18092): VFY:  rejecting opcode 0x0d at 0x005f
W/dalvikvm(18092): VFY:  rejected Lcom/ning/http/client/providers/jdk/JDKAsyncHttpProvider;.createUrlConnection (Lcom/ning/http/client/Request;)Ljava/net/HttpURLConnection;
W/dalvikvm(18092): Verifier rejected class Lcom/ning/http/client/providers/jdk/JDKAsyncHttpProvider;
W/dalvikvm(18092): Exception Ljava/lang/VerifyError; thrown while initializing Ldispatch/Http$;
W/System.err(18092): java.lang.VerifyError: com/ning/http/client/providers/jdk/JDKAsyncHttpProvider
W/System.err(18092): at com.ning.http.client.AsyncHttpClient.loadDefaultProvider(AsyncHttpClient.java:592)
W/System.err(18092): at com.ning.http.client.AsyncHttpClient.<init>(AsyncHttpClient.java:184)
W/System.err(18092): at dispatch.InternalDefaults$.client(defaults.scala:29)
W/System.err(18092): at dispatch.Http$.<init>(execution.scala:30)
W/System.err(18092): at dispatch.Http$.<clinit>(execution.scala)
W/System.err(18092): at your.application.package.ClassName$$anonfun$onCreate$2$$anonfun$apply$2.apply(MessageReceivingService.scala:61)
W/System.err(18092): at your.application.package.ClassName$$anonfun$onCreate$2$$anonfun$apply$2.apply(MessageReceivingService.scala:53)
W/System.err(18092): at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)
W/System.err(18092): at scala.util.Try$.apply(Try.scala:161)
W/System.err(18092): at scala.util.Success.map(Try.scala:206)
W/System.err(18092): at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
W/System.err(18092): at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
W/System.err(18092): at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
W/System.err(18092): at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
W/System.err(18092): at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
W/System.err(18092): at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)
W/System.err(18092): at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)
W/System.err(18092): at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
W/System.err(18092): at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

対処法は、下記の処理を通信前に実行することです。なぜ動くようになるのか謎ですが、AndroidでDispatchが使えるようになるのは幸せなことなのでこれで良いんです。理由がわかる方は教えて下さい。

import com.ning.http.client.AsyncHttpClientConfig
import com.ning.http.client.providers.netty.NettyAsyncHttpProvider
new NettyAsyncHttpProvider(new AsyncHttpClientConfig.Builder().build)