Cómo solicitar Http Request Clojure en Android
neko (1)
Estoy usando el complemento lein droid para desarrollar aplicaciones de Android. pero tengo un problema para recibir datos de internet.
[EDIT] esta es la aplicación que acaba de abrir y haz clic en el botón que contiene slurp.
I/ActivityManager( 352): Displayed bnm.ikinci.app/.MainActivity: +574ms
D/AndroidRuntime( 1134): Shutting down VM
W/dalvikvm( 1134): threadid=1: thread exiting with uncaught exception (group=0xa5ab4ba8)
E/AndroidRuntime( 1134): FATAL EXCEPTION: main
E/AndroidRuntime( 1134): Process: bnm.ikinci.app, PID: 1134
E/AndroidRuntime( 1134): clojure.lang.ArityException: Wrong number of args (1) passed to: main/MainActivity-onCreate/fn--49
E/AndroidRuntime( 1134): at clojure.lang.AFn.throwArity(AFn.java:429)
E/AndroidRuntime( 1134): at clojure.lang.AFn.invoke(AFn.java:32)
E/AndroidRuntime( 1134): at neko.listeners.view$on_click_call$reify__174.onClick(view.clj:26)
E/AndroidRuntime( 1134): at android.view.View.performClick(View.java:4438)
E/AndroidRuntime( 1134): at android.view.View$PerformClick.run(View.java:18422)
E/AndroidRuntime( 1134): at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime( 1134): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 1134): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 1134): at android.app.ActivityThread.main(ActivityThread.java:5001)
E/AndroidRuntime( 1134): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1134): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1134): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
E/AndroidRuntime( 1134): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
E/AndroidRuntime( 1134): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 352): Force finishing activity bnm.ikinci.app/.MainActivity
D/dalvikvm( 352): GC_FOR_ALLOC freed 853K, 15% free 6436K/7492K, paused 47ms, total 50ms
W/ActivityManager( 352): Activity pause timeout for ActivityRecord{a614d430 u0 bnm.ikinci.app/.MainActivity t7 f}
W/EGL_emulation( 524): eglSurfaceAttrib not implemented
[/EDITAR]
Pego estas dos líneas en mi AndroidManifest.template.xml en mi directorio raíz como verdadero lugar [bajo la etiqueta use-sdk];
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Después de este paso solo trato de obtener algunos datos de internet ("slurp" https://www.google.com ) pero ato esta declaración al evento de clic de un botón, cuando hago clic; obtengo la aplicación se ha detenido.
De otra manera,
(defn maslurp [url]
(let [a (new java.io.BufferedReader
(new java.io.InputStreamReader
(.getInputStream (doto (.openConnection (new java.net.URL url))
(.setRequestMethod "GET")
(.setDoOutput true)
(.setUseCaches false)))))]
(loop [r (.readLine a) s ""]
(if (nil? r)
s
(recur (.readLine a) (clojure.string/join [s r]))))))
(maslurp "https://www.google.com") ; doesn''t work either.
Probé la misma aplicación en mi teléfono SM-C101 (S4 Zoom) y mi emulador.
por cierto, sé que las bibliotecas apache para http request en Android pero no pude usarlo en mi proyecto de droides lien.
[sí, estoy seguro de que tengo internet en mis dispositivos]
Qué he hecho mal ?
perdón por mi mal inglés, gracias por tu ayuda a partir de ahora.
El anterior (maslurp) funciona en la aplicación Clojure REPL de Android, si (.setDoOutput) se establece en falso en su lugar, según esta pregunta :
(defn maslurp [url]
(let [a (new java.io.BufferedReader
(new java.io.InputStreamReader
(.getInputStream (doto (.openConnection (new java.net.URL url))
(.setRequestMethod "GET")
(.setDoOutput false) ; false for GET
(.setUseCaches false)))))]
(loop [r (.readLine a) s ""]
(if (nil? r)
s
(recur (.readLine a) (clojure.string/join [s r]))))))
(maslurp "https://www.google.com") ; works in Clojure REPL app