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)