0

在我的应用程序中,我加载了一个 webview(登录表单),它会将我重定向到实际的登录表单,然后我会在同一个 webview 中显示该表单。这个 webview 是从我的 onCreateView 调用的,

new FetchLoginFormTask().execute();

但是,我间歇性地注意到 android.os.NetworkOnMainThreadException,这让我认为 webView.loadUrl() 方法导致了这种情况。我一直无法重现这一点,所以我在 onPostExecute() 中创建了一个 Asynctask,但我在 logcat 中注意到我无法从另一个 asynctask 中调用 webview。我有哪些选择可以确保在没有任何 ANR 的情况下加载登录表单,或者我缺少哪些最佳实践?

private class FetchLoginFormTask extends AsyncTask<String, Integer, Response> {

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Response doInBackground(String... params) {

        int paramLen = params.length;
        Response result = MyOAuth.fetchLoginForm();
        return result;
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
    }

    @Override
    protected void onPostExecute(Response result) {

        if (result != null) {
            //in case of redirect
            if (result.getCode() == 302) {
                Log.i(TAG, "Response was redirect: " + result.getCode());
                //TODO: isn't this a network operation on main UI thread?
                webView.loadUrl(result.getHeader("Location"));
            } else {
                String html = result.getBody();
                webView.loadData(html, "text/html", "UTF-8");
            }
       }

    }
}
4

0 回答 0