私は現在、イワシをベースにしたAndroid用のWebDAVクライアントを実装しています(https://github.com/lookfirst/sardine)。Android-Clientは、APIレベル15(min-Apiレベル)を対象としています。
今、次のようにSardineFactoryクラスを使用して接続を初期化します。
sardine = SardineFactory.begin(user, password);
このコードはアクティビティ内に埋め込まれており、認証情報が有効かどうかを確認します。アクティビティの[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)。
参照しているsardine.jarにソースをアタッチすると、beginメソッドとそのオーバーロードをデバッグできます。呼び出される最後の「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;
}
問題を引き起こしているようです。
ご覧のとおり、スローされた例外をキャッチできるかどうかを確認するために、trycatchで既に変更しています。しかし、SardineImplコンストラクターをステップオーバーするとすぐに、ExceptionInInitializerErrorがスローされます。私はそれを捕まえる機会がありません。
一部のライブラリがまだ不足していると思います。Mavenビルドスクリプト(クリーンインストール)を使用して、Eclipse内で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例外をどのように解釈できますか?
この問題を解決するためだけに。webdav経由でownCloudインスタンスにアクセスしたかったので、イワシライブラリを削除して、ネイティブのownCloudライブラリ(https://github.com/owncloud/android-library)に移動することにしました。このライブラリにはかなり優れたサンプルクライアントが含まれており、私のプロジェクトに最適です。
ありがとう
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加