首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Android的Java沙丁鱼webdav客户端

基于Android的Java沙丁鱼webdav客户端
EN

Stack Overflow用户
提问于 2015-09-11 17:00:48
回答 3查看 2.8K关注 0票数 0

我目前正在为安卓系统实现一个WebDAV客户端,它基于沙丁鱼(https://github.com/lookfirst/sardine)。Android的目标是API级别15 (min级别)。

现在,我希望使用Sardine类初始化连接,如下所示:

代码语言:javascript
复制
sardine = SardineFactory.begin(user, password);

这段代码嵌入到一个活动中,该活动将检查凭据是否有效。通过按下活动的OK按钮,启动了一个AsyncTask,它嵌入了上面的代码线

代码语言:javascript
复制
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窗口中看到:

代码语言:javascript
复制
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方法及其重载中。最后的“开始”方法,它是由

代码语言:javascript
复制
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构建脚本(干净安装)在eclipse中构建sardine.jar。源代码保持不变,但我添加了以下缺少的库

代码语言:javascript
复制
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设置(、-> Order和)中的钩子是为所有外部库设置的。因此,当在目标设备上构建和安装APK时,我假设什么都没有丢失。

有没有人遇到过类似的问题?如何解释ExceptionInInitializerError异常?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-18 16:35:19

只是为了结束这个问题。由于我想通过webdav访问ownCloud实例,所以我决定放弃沙丁鱼库,转而使用本机ownCloud库(https://github.com/owncloud/android-library)。这个库包含了一个很好的示例客户端,并且非常适合我的项目。

谢谢

票数 1
EN

Stack Overflow用户

发布于 2015-09-15 06:49:24

我通过使用沙丁鱼图书馆( Sardine )克服了这个问题,该图书馆是为安卓系统重写的一个Android项目(https://github.com/aflx/Sardine-Android)。我将项目导入Eclipse,构建它并将jar文件从bin子目录链接到我的项目中。最后,我必须在项目的设置中设置钩子"Build“-> "Order and”。

这一解决方案解决了上述问题。现在,我又走了一步,但还是有例外。当我尝试用下面的代码行列出远程服务器上的文件和文件夹时

代码语言:javascript
复制
List<DavResource> res = sardine.list(hostName);

我得到了一个NoClassDefFoundError,它告诉我他找不到org.simpleframework.xml.core.Persister类。

代码语言:javascript
复制
E/AndroidRuntime(26434): Caused by: java.lang.NoClassDefFoundError: org.simpleframework.xml.core.Persister

在Sardine-Android的项目设置中,我链接了

代码语言:javascript
复制
simple-xml-2.6.2.jar

其中应该包含缺失的类。此外,我在其他站点(19444554/)中看到,可能有必要将类排除在构建路径之外,因为它们可能与类中的构建冲突。不幸的是,他们正在与gradle一起工作,而我还没有与之合作。我会在网上搜索一个解决方案,但也许有人知道这么做的热度?

票数 0
EN

Stack Overflow用户

发布于 2015-10-14 18:35:29

我在试图让Sardine在Android上工作时也遇到了类似的问题。我正在使用Android,使用SDK 21构建。我只是下载了Sardine源代码,并将它们添加到/app/src/main/java文件夹中的项目和/app/libs中的simple-xml-2.6.3.jar中。我正在使用ActionBarActivity。代码构建时没有错误。然而,我在同一行中得到了另一个错误,但没有得到NoClassDefFoundError

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32528599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档