我目前正在为Android实现一个基于沙丁鱼(https://github.com/lookfirst/sardine)的WebDAV客户端。Android-Client的目标是API级别15(最小API级别)。
现在我想使用Sardine Factory类初始化连接,如下所示:
sardine = SardineFactory.begin(user, password);
这段代码嵌入到一个Activity中,它将检查凭据是否有效。通过按下活动的OK按钮,一个AsyncTask被启动,它嵌入了上面的代码行
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();
}
};
当我调试android应用程序时,我发现沙丁鱼首先从SardineFactory初始化。如果跨过这一行,就会抛出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)。
如果我将源代码附加到我引用的沙丁鱼.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。我没有机会抓住它。
我假设,某些库仍然缺失。我通过maven构建脚本(clean install)在eclipse中构建沙丁鱼.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 Build Path -> Order and Export)是为所有外部库设置的。因此,当APK在目标设备上构建和安装时,我假设没有丢失任何东西。
有人遇到过类似的问题吗?如何解释ExceptionInInitializerError异常?
只是为了结束这个问题。由于我想通过webdav访问一个ownCloud实例,我决定放弃沙丁鱼库,转而使用原生ownCloud库(https://github.com/owncloud/android-library)。这个库包含了一个非常好的客户端示例,对于我的项目来说非常完美。
谢谢
我能够通过使用Sardine Library来克服这个问题,它被重写为Android的Android-Library项目(https://github.com/aflx/Sardine-Android)。我将项目导入到Eclipse Workspace中,构建它并将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,我还没有使用过。我会在网上搜索一个解决方案,但也许有人知道怎么做?
我在尝试让Sardine在Android上工作时遇到了类似的问题。我正在使用Android Studio,使用SDK 21构建。我只是下载了沙丁鱼- android源代码,并将它们添加到/app/libs
中的/app/src/main/java
和simple-xml-2.6.3.jar
文件夹中。我用的是ActionBarActivity
。代码构建时没有错误。然而,我在同一行中得到另一个错误,但不是NoClassDefFoundError