2016-11-29 115 views
0

如何在Clojure Android項目中製作HTTP請求?Clojure Android HTTP請求

  • 既不clj-http也不http-kit似乎是Android的友好
  • this question的方法給出了一個android.os.NetworkOnMainThreadException

試圖根據給定here存在各種問題的答案,解決Exception。首選解決方案(使用AsyncTask)需要子類化,並且我不完全清楚如何編寫這樣做的Clojure代碼。試圖更改StrictMode設置會導致與命名空間相關的錯誤。最後,啓動一個新線程來處理與(.start (Thread. (fn [] ...)))的Web請求完全崩潰的應用程序在測試。

所以,再次說明一下:如何在使用Clojure Android編寫的Android應用程序中創建HTTP請求?

+1

你可以嘗試使用[retrofit](http://square.github.io/retrofit/),這是說在Android上工作很好。這裏有一個簡單的例子:https://github.com/bamboo/clojure-retrofit-spike – leetwinski

+0

@leetwinski - 沒有骰子,看起來像:/只是'輸入'''[retrofit.http GET Path]'導致項目崩潰設備上。 – Inaimathi

回答

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")) 
+0

這似乎並不能解決問題。問題是關於在用[Clojure Android](http://clojure-android.info/)構建的應用程序中運行HTTP請求(添加鏈接到問題以闡明)。在這種情況下,調用上述定義仍然會引發'android.os.NetworkOnMainThreadException'。 – Inaimathi

+0

有clojure-android neko庫,其中包括調用'(未來(let [..](on-ui(..))''':[https://github.com/clojure-android/neko /搜索?UTF8 =%E2%9C%93&q =上的UI] – merryreaper