Ответ 1
Эта проблема возникает на уровнях API Android до 19. В затронутых версиях Socket не реализует Closeable.
Источники:
В Android-приложении я добавил этот код в onCreate()
Closeable sss = new Socket();
if (!(sss instanceof Closeable)) {
throw new RuntimeException("Something unexpected happened");
}
Импорт:
import java.io.Closeable;
import java.net.Socket;
Код компилируется, но Я получаю исключение:
E/AndroidRuntime( 8293): java.lang.RuntimeException: Unable to start activity...: java.lang.RuntimeException: Something unexpected happened
...
E/AndroidRuntime( 8293): Caused by: java.lang.RuntimeException: Something unexpected happened
...
В другом контексте глюк вызывает java.lang.ArrayStoreException
(а именно, java.lang.ArrayStoreException: java.net.Socket не может быть сохранен в массиве типа java.io.Closeable []).
Я что-то упустил? Любая идея, что делать?
ИЗМЕНИТЬ
Аналогично, когда DatagramSocket
используется как MyClass<DatagramSocket>
для MyClass<T extends Closeable>
, он вызывает java.lang.IncompatibleClassChangeError: интерфейс не реализован.
Эта проблема возникает на уровнях API Android до 19. В затронутых версиях Socket не реализует Closeable.
Источники:
Socket сам по себе не может быть закрыт, но оба его потока. И закрытие любого потока закроет Socket
Для будущих читателей я хочу прояснить то, что предполагалось очевидным для всех в этом обсуждении:
Как я могу назначить Closeable sss = new Socket();
, если Socket
не Closeable
?
Требования API, указанные в AndroidManifest.xml, следующие:
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
и отчеты устройства
android.os.Build.VERSION.SDK_INT=16
Код был скомпилирован для уровня API 19, поэтому он был успешно скомпилирован. Но он был запущен на уровне API 16, и именно поэтому он потерпел неудачу.
Другими словами, проверка времени компиляции была выполнена для API19 на одном компьютере (настольный ПК), в то время как проверка выполнения была выполнена для API16 на другом компьютере (карманное устройство).