Async Task, Webview, Cookies - Android - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть «родной» экран входа в систему, который устанавливает статический файл 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();
        }
    }
}

1 Ответ

1 голос
/ 29 апреля 2011

Не могли бы вы, возможно, попробовать решение с подключением потоков, которое я предложил в управлении сеансами Android При входе в систему это можно использовать.А что касается WebView, вы можете передать cookie с помощью (sCookie - это статическая строка cookie, уже заданная действием входа в систему):

 CookieSyncManager.createInstance(this);
 CookieManager cookieManager = CookieManager.getInstance();

 String cookieString = sCookie+"; domain="+sDOMAIN;
 cookieManager.setCookie(sDOMAIN, cookieString);
 CookieSyncManager.getInstance().sync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...