【问题标题】:WebView in android loading stale contentandroid中的WebView加载过时的内​​容
【发布时间】:2017-01-28 12:22:28
【问题描述】:

我正在制作一个应用程序,它使用 webview 为登录用户显示来自 url 的内容。这是一个非常基本且小型的应用程序。我的问题是用户注销并且其他一些用户登录时,会显示以前加载的内容(过时的内容)。这是java类:

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.HashMap;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;


public class WebViewActivity extends Activity {
    boolean clearHistory;
    private final String API_KEY = "apiKey";
    private final String TOKEN = "token";
    private WebView mWebView;
    String TAG="Response";
    TextView topbar;
    LinearLayout parentLayout;
    HashMap<String, String> maps = new HashMap<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
        mWebView =(WebView)findViewById(R.id.webview1);
        mWebView.stopLoading();
        topbar=(TextView)findViewById(R.id.topbar);
        parentLayout=(LinearLayout)findViewById(R.id.parentLayout);

        SharedPreferences pref = getSharedPreferences("MyPref", 0);
        final String webviewUrl = pref.getString("webviewUrl", "");
        final String token = pref.getString("app_token", "");
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);


        topbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(WebViewActivity.this);
                alertDialog.setTitle("Confirm Logout");
                alertDialog.setMessage("Are you sure you want to logout?");
                alertDialog.setIcon(R.drawable.smlalo);
                alertDialog.setPositiveButton("Logout", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int which) {

                        SharedPreferences pref = getSharedPreferences(
                                "MyPref", 0);
                        SharedPreferences.Editor editor = pref.edit();
                        editor.putString("webviewUrl", "");
                        editor.putString("app_token", "");
                        editor.commit();
                        maps.put(TOKEN,token);
                        maps.put(API_KEY, BuildConfig.API_KEY_VALUE);
                        RestClient.getApiInterface().logout(maps).enqueue(new Callback<String>() {
                            @Override
                            public void onResponse(Call<String> call, Response<String> response) {
                                startActivity(new Intent(WebViewActivity.this, MainActivity.class));
                                finish();
                            }

                            @Override
                            public void onFailure(Call<String> call, Throwable t) {

                            }
                        });
                    }
                });

                // Setting Negative "NO" Button
                alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

                // Showing Alert Message
                alertDialog.show();
            }
        });

        final ProgressDialog progressDialog = ProgressDialog.show(WebViewActivity.this, "", "Loading...");

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onLoadResource(WebView view, String url) {
                view.clearHistory();
                super.onLoadResource(view,url);
            }
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon)
            {
                progressDialog.show();
                super.onPageStarted(view, url, favicon);
            }
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.i(TAG, "Processing webview url click...");
//                view.loadUrl(url);
                super.shouldOverrideUrlLoading(view, url);
                return false;
            }
            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                view.loadUrl(request.getUrl().toString());
                super.shouldOverrideUrlLoading(view, request);
                return false;
            }
            public void onPageCommitVisible(WebView view, String url) {
                view.clearHistory();
                view.clearCache(true);
            }
            @Override
            public void onPageFinished(WebView view, String url) {
                Log.i(TAG, "Finished loading URL: " +url);
                topbar.setVisibility(View.VISIBLE);
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                /*if (clearHistory)
                {
                    clearHistory = false;
                    mWebView.clearHistory();
                    mWebView.clearCache(true);
                    if (progressDialog.isShowing()) {
                        progressDialog.dismiss();
                    }
                }*/
                super.onPageFinished(view, url);
            }
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Log.e(TAG, "Error: " + description);
                new android.app.AlertDialog.Builder(WebViewActivity.this)
                        .setTitle("Error")
                        .setMessage(description)
                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                // continue with delete
                            }
                        })
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .show();
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
                super.onReceivedError(view,errorCode,description,failingUrl);
            }
            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                new android.app.AlertDialog.Builder(WebViewActivity.this)
                        .setTitle("Error")
                        .setMessage(error.getDescription())
                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                // continue with delete
                            }
                        })
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .show();
                super.onReceivedError(view, request, error);
            }
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onReceivedHttpError(WebView view,
                                            WebResourceRequest request, WebResourceResponse errorResponse) {

                Toast.makeText(WebViewActivity.this, "WebView Error" + errorResponse.getReasonPhrase(), Toast.LENGTH_SHORT).show();

                super.onReceivedHttpError(view, request, errorResponse);
            }

        });
        /*mWebView.loadUrl("about:blank");
        mWebView.reload();*/
        mWebView.loadUrl(webviewUrl);
//        clearHistory = true;
//        mWebView.reload();
    }

}

这是布局文件:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:id="@+id/parentLayout"
    android:layout_height="fill_parent"
    tools:context=".SplashActivity">

    <RelativeLayout
        android:background="@color/colorPrimary"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".2"
        android:padding="10dp"
        android:id="@+id/topbarbbb">

    <ImageView
        android:text="@string/coachapp"
        android:layout_width="wrap_content"
        android:layout_centerVertical="true"
        android:src="@drawable/smlalo"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:id="@+id/imageView2" />
    <TextView
        android:text="Logout"
        android:textSize="12sp"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:visibility="gone"
        style="@style/Base.TextAppearance.AppCompat.Button"
        android:id="@+id/topbar"
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerInParent="true">

    </TextView>

</RelativeLayout>

    <WebView android:id="@+id/webview1"
        android:layout_below="@+id/topbarbbb"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />
</LinearLayout>

另外提一下,我已经对此进行了调试和研究。 sharedpreferences 不是问题,正在检索的 url 是我要显示的。它在浏览器中正确打开。已经尝试过所有以前的答案,如Clear previously loaded Webview's content before loading the next oneclear webview history 和这个:Destroying the WebView。这些都不适合我。
非常感谢您的帮助。

【问题讨论】:

  • 请不要delete and repost questions。只需使用您拥有的任何新信息编辑您的原始帖子,即可将其排在活动队列的顶部。
  • 我明白这一点,但我包含了一些我不应该包含的内容。编辑也不起作用,因为任何人都有可能看到它。所以我不得不更正并重新发布。

标签: android webview


【解决方案1】:

此问题可能是由于您的 Web 视图中保存了 javascript cookie。在打开 web 视图之前刷新 cookie。

【讨论】:

    【解决方案2】:

    我想通了。事实证明,由于在 webview 中使用了 javascript,它导致了 cookie 的创建。成功注销后,我只需要添加代码即可清除 cookie。这是我使用的:

    @SuppressWarnings("deprecation")
    public static void clearCookies(Context context)
    {
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            Log.d(C.TAG, "Using clearCookies code for API >=" + String.valueOf(Build.VERSION_CODES.LOLLIPOP_MR1));
            CookieManager.getInstance().removeAllCookies(null);
            CookieManager.getInstance().flush();
        } else
        {
            Log.d(C.TAG, "Using clearCookies code for API <" + String.valueOf(Build.VERSION_CODES.LOLLIPOP_MR1));
            CookieSyncManager cookieSyncMngr=CookieSyncManager.createInstance(context);
            cookieSyncMngr.startSync();
            CookieManager cookieManager=CookieManager.getInstance();
            cookieManager.removeAllCookie();
            cookieManager.removeSessionCookie();
            cookieSyncMngr.stopSync();
            cookieSyncMngr.sync();
        }
    }
    

    完整的答案可以在这里找到:clear cookies webview

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多