Простыми словами,
НЕ ДЕЛАЙТЕ СЕТЕВЫЕ РАБОТЫ В РЕЖИМЕ UI
Например, если вы выполняете HTTP-запрос, это сетевое действие.
Решение:
Путь:
Поместите все ваши работы внутри
run()
метода нового потока doInBackground()
метода класса AsyncTask. Но:
Когда вы получаете что-то из ответа сети и хотите показать его на своем экране (например, сообщение с ответом на отображение в TextView), вам нужно вернуться обратно в пользовательский интерфейс thread.
Если вы этого не сделаете, вы получите ViewRootImpl$CalledFromWrongThreadException
.
Как?
onPostExecute()
runOnUiThread()
и обновите внутри метода run()
. Обновления: - Я никогда не был экспертом в этом вопросе, следующее является лишь обходным решением и может быть небезопасным, используйте его на свой страх и риск. Это сообщение старше 3 лет, поэтому он может быть устаревшим теперь (код не будет компилироваться), но вы должны найти возможность найти обновленный подход или официальные документы, говорящие, что некоторые части устарели или удалены.
Благодарите noloader за указание на меня в направлении коррекции. Я решил решить эту проблему, используя следующее:
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);// my question shows how to get 'ca'
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
tmf.init(ca);
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
origTrustmanager.checkClientTrusted(certs, authType);
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkServerTrusted(certs, authType);
} catch (CertificateExpiredException e) {}
}
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, wrappedTrustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
Из 3 сертификатов, найденных для сайта, упомянутых в моем вопросе, тот, который работал для меня, был VeriSign Class 3 Secure Server CA - G3