【问题标题】:Clojure Android HTTP requestClojure Android HTTP 请求
【发布时间】:2016-11-29 22:22:05
【问题描述】:

如何在 Clojure Android 项目中发出 HTTP 请求?

  • clj-httphttp-kit 似乎都不适合 Android
  • this question 中的方法给出了android.os.NetworkOnMainThreadException

尝试根据here 给出的答案解决Exception 有各种问题。首选解决方案(使用AsyncTask)需要子类化,我不完全清楚如何编写这样做的Clojure 代码。尝试更改 StrictMode 设置会导致与命名空间相关的错误。最后,使用 (.start (Thread. (fn [] ...))) 启动一个新线程来处理 Web 请求会导致应用程序在测试中完全崩溃。

那么,再说一遍:如何在使用 Clojure Android 编写的 Android 应用程序中发出 HTTP 请求?

【问题讨论】:

  • 你可以尝试使用retrofit,据说在android上工作得很好。这是一个简单的例子:github.com/bamboo/clojure-retrofit-spike
  • @leetwinski - 没有骰子,看起来像:/ 仅仅importing [retrofit.http GET Path] 导致项目在设备上崩溃。

标签: java android clojure


【解决方案1】:

the question you linked to above 之后,他们的 (maslurp) 在 android Clojure REPL app 中工作,如果 (.setDoOutput) 设置为 false,则按照 this question,并且您将调用包装在 future 中(以避免android.os.NetworkOnMainThreadException) :

(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]))))))


@(future (maslurp "https://www.google.com"))

【讨论】:

  • 这似乎不能解决问题。问题是关于在使用Clojure Android 构建的应用程序中运行 HTTP 请求(添加问题链接以澄清)。在这种情况下,调用上述定义仍会引发android.os.NetworkOnMainThreadException
  • 有clojure-android neko库,支持调用(future (let [..] (on-ui (..))): [github.com/clojure-android/neko/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多