gpt4 book ai didi

Android 上的 Java sardine webdav 客户端

转载 作者:行者123 更新时间:2023-12-01 11:09:37 53 4
gpt4 key购买 nike

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

现在我想使用 Sardine Factory 类来初始化连接,如下所示:

sardine = SardineFactory.begin(user, password);

这段代码嵌入在 Activity 中,该 Activity 将检查凭据是否有效。通过按 Activity 的“确定”按钮,将启动嵌入上面代码行的 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 初始化 sardine。如果我跨过这条线,就会抛出 ExceptionInInitializerError 。虽然有一个 try catch 语句,但整个 Activity 崩溃了,并且可以在 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 构建路径 -> 顺序和导出)中的 Hook 是为所有外部库设置的。因此,我假设当 APK 构建并安装在目标设备上时,没有丢失任何内容。

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

最佳答案

只是为了解决这个问题。由于我想通过 webdav 访问 ownCloud 实例,我决定放弃 sardine 库并使用 native ownCloud 库( https://github.com/owncloud/android-library )。该库包含一个非常好的示例客户端,非常适合我的项目。

谢谢

关于Android 上的 Java sardine webdav 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32528599/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com