2015-09-11 130 views
0

我目前正在實施基於沙丁魚(https://github.com/lookfirst/sardine)的Android WebDAV客戶端。 Android客戶端針對API級別15(min-Api級別)。Android上的沙丁魚webdav客戶端

現在我想通過沙丁魚工廠類這樣的初始化連接:

sardine = SardineFactory.begin(user, password); 

這段代碼被嵌入的活動中,也應檢查證書是否有效。通過按一個的AsyncTask啓動活動上的確定按鈕。當我調試Android應用程序中嵌入上述

AsyncTask<ServerCredentials, Void, ServerCredentials> verifyCredentialsTask = new AsyncTask<String[], Void, boolean>(){ 
      @Override 
      protected boolean doInBackground(String[]...c) { 
       try { 
        String user = c[0]; 
        String password = c[1] 
        sardine = SardineFactory.begin(user, password); 
        return true; 
       } 
       catch (Exception e) { 
        return false; 
       } 

      }; 

      @Override 
      protected void onPostExecute(ServerCredentials sc) { 
       final Intent intent = new Intent(); 
       ... 

       setAccountAuthenticatorResult(intent.getExtras()); 
       setResult(RESULT_OK); 
       finish(); 
      } 
     }; 

的代碼行,我起牀到沙丁魚首先從SardineFactory initialzed點。如果我跨過這一行,將引發ExceptionInInitializerError。雖然,有一個try catch語句,整個活動崩潰和下面的異常跟蹤,可以在logcat的窗口中可以看出:

E/AndroidRuntime(10996): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(10996): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(10996): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
E/AndroidRuntime(10996): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
E/AndroidRuntime(10996): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
E/AndroidRuntime(10996): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
E/AndroidRuntime(10996): at java.lang.Thread.run(Thread.java:856) 
E/AndroidRuntime(10996): Caused by: java.lang.ExceptionInInitializerError 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:45) 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:34) 
E/AndroidRuntime(10996): at com.github.sardine.SardineFactory.begin(SardineFactory.java:22) 

我已經尋找一個答案的網站。 ExceptionInInitializerError的定義是通用的(https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/ExceptionInInitializerError.html)。

如果我將源代碼附加到引用的sardine.jar中,我可以調試到begin方法和它們的重載。被稱爲的最終「開始」方法定義爲

public static Sardine begin(String username, String password, ProxySelector proxy) 
{ 
    try { 
     return new SardineImpl(username, password, proxy); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

似乎導致該問題。

正如你所看到的,我已經用try catch修改了它,以查看我是否可以捕獲拋出的異常。但是一旦我跨過SardineImpl構造器,ExceptionInInitializerError就會被拋出。我沒有機會抓住它。

我認爲,有些圖書館仍然失蹤。我在eclipse中通過maven構建腳本構建了sardine.jar(乾淨安裝)。源是不變的,除了我添加了以下缺失的庫

ant-1.9.2.jar 
commons-codec-1.6.jar 
commons-logging-1.1.3.jar 
httpclient-4.5.jar 
httpcore-4.3.2.jar 
slf4j-api-1.7.12.jar 
slf4j-jdk14-1.7.12.jar 

在Eclipse項目設置的鉤子(Java構建路徑 - >在線訂單和出口)爲所有外部庫設置。因此,我認爲當APK構建並安裝在目標設備上時,什麼也不會丟失。

有沒有人遇到過類似的問題?我如何解釋ExceptionInInitializerError異常?

回答

1

只是爲了解決這個問題。由於這個事實,我想通過webdav訪問一個ownCloud實例,我決定放棄沙丁魚庫,並去當地的ownCloud庫(https://github.com/owncloud/android-library)。這個庫包括一個很好的示例客戶端,併爲我的項目工作完美。

謝謝

0

我能夠通過使用沙丁魚圖書館來解決這個問題,沙丁魚圖書館是作爲Android-Library項目(https://github.com/aflx/Sardine-Android)爲Android重寫的。 我將項目導入到Eclipse工作區中,構建它並將bin子目錄中的jar文件鏈接到我的項目中。最後,我必須在項目設置「Build Path」 - >「Order and Export」中設置鉤子。

該解決方案解決了上述問題。現在,我是更進一步,但仍然得到一個例外。當我嘗試用下面的代碼行

List<DavResource> res = sardine.list(hostName); 

列出遠程服務器上的文件和文件夾,我得到一個NoClassDefFoundError的告訴我說,他找不到類org.simpleframework.xml.core.Persister。

E/AndroidRuntime(26434): Caused by: java.lang.NoClassDefFoundError: org.simpleframework.xml.core.Persister 

內沙丁的Android項目設置我已經掛了

simple-xml-2.6.2.jar 

應包含缺少的類。 此外,我已閱讀其他站點(http://android.phonesdevelopers.com/1011_19444554/),可能有必要從構建路徑中排除類,因爲它們可能會與構建類相沖突。不幸的是,他們正在使用Gradle,我還沒有使用它。 我會在網上搜索一個解決方案,但也許有人知道這很熱?

0

我有類似的問題試圖讓沙丁魚在Android上工作。我使用的是Android Studio,使用SDK 21構建。我只是簡單地下載了Sardine-Android源代碼並將它們添加到文件夾/app/src/main/javasimple-xml-2.6.3.jar中的項目/app/libs中。我正在使用ActionBarActivity。代碼生成沒有錯誤。 但是我在同一行中得到另一個錯誤,但不是NoClassDefFoundError