У меня есть «родной» экран входа в систему, который устанавливает статический файл cookie, а затем это действие получает файл cookie от LoginWebView.
Я делаю это в асинхронной задаче.
Теперь проблема в том, что асинхронная задача содержит 3 очень уродливых хака, что делает код очень ненадежным (хаки выделены в приведенном ниже коде).
Вопрос в том, знаете ли вы, как избавиться от одного или нескольких из этих уродливых хаков?
Hack № 1 -
Это взято из примера, который кто-то опубликовал здесь о переполнении стека, cookie должен немного подождать, прежде чем он действительно заработает и загрузится в веб-обозрение, я понятия не имею, почему без него он просто не работает Хотя это не самая большая проблема.
Hack № 2 -
Я не знаю почему, но если я хочу иметь возможность загрузить другую страницу, я должен сначала загрузить страницу, с которой я получил cookie. Когда это загружено, я просто немного подожду, а затем загружаю другой URL. У кого-нибудь есть идеи почему?
Если я этого не сделаю, веб-просмотр признает, что файл cookie существует, но не заканчивает загрузку каких-либо страниц вообще, он просто зависает при загрузке и никогда не заканчивается.
Hack № 3 -
Это просто исправление взлома номер 2.
private class WebViewTask extends AsyncTask<Void, Void, Boolean> {
String cookieString1;
CookieManager cookieManager;
@Override
protected void onPreExecute() {
Cookie sessionCookie = LoginWebView.cookie1;
CookieSyncManager.createInstance(WebViewActivity.this);
cookieManager = CookieManager.getInstance();
cookieString1 = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; " +
"domain=" + sessionCookie.getDomain();
CookieSyncManager.getInstance();
//cookieManager.removeSessionCookie();
super.onPreExecute();
}
protected Boolean doInBackground(Void... param) {
// HACK NR.1
SystemClock.sleep(600);
return false;
}
@Override
protected void onPostExecute(Boolean result) {
Log.v(TAG, "COOKIE SYNC 1: " + cookieString1);
Log.v(TAG, "COOKIE SYNC 1: " + domain);
cookieManager.setCookie(domain, cookieString1);
CookieSyncManager.getInstance().sync();
WebSettings webSettings = webView.getSettings();
webSettings.setSavePassword(true);
webSettings.setSaveFormData(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "Loading...");
view.loadUrl(url);
return true;
}
});
//HACK NR 2
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
webView.loadUrl(domain);
Log.v(TAG, "PROGRESS " + webView.getProgress());
button1.setChecked(true);
if(webView.getProgress() == 100) {
//HACK NR. 3
SystemClock.sleep(80);
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
clickButtonOne();
}
}
}