2015-10-28 39 views
2

我正在使用lein droid插件来开发android应用程序。但我有一个关于从互联网接收任何数据的问题。如何在Android上Http请求Clojure [lein droid&neko]

[编辑]这是刚刚打开的应用程序,并单击包含啜食的按钮。

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 

[/编辑]

我在我的AndroidManifest.template.xml这两条线贴在我的根目录是真正的地方[使用-SDK标签下]

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

这一步后,我只是尝试从互联网上获取一些数据(啜食“https://www.google.com”),但我这个声明绑定到单击事件,当我点击一个按钮的;我得到的应用程序已停止。

的另一种方式,

(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. 

我想我的电话SM-C101(S4变焦)和我的仿真器上相同的apk。

顺便说一下,我知道在Android上的http请求Apache库,但我不能用我的留置权机器人项目。

[是的,我相信我有互联网在我的设备]

我做了什么错?

对不起我的英文不好,感谢从现在开始你的帮助。

+0

“*我得到的应用程序已经停止*” 是“这是一个等价不工作“,请不要报告那样的问题。调查究竟发生了什么,试着查看日志并寻找原因。 –

+1

我也不能得到任何日志,repl和调试设置不起作用。但我可以拍摄屏幕截图。 –

+0

来自堆栈跟踪我没有看到maslurp正在运行的任何证据。我怀疑这个问题是在那之前发生的。 –

回答

0

以上(maslurp)的作品在Android Clojure REPL app,如果(.setDoOutput)设置为false代替,每this question

(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