Android中的WebView加载陈旧的内容

问题描述:

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

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不是问题,正在检索的网址是我想要显示的网址。它在浏览器中正确打开。已尝试所有以前的答案,如Clear previously loaded Webview's content before loading the next one,clear webview history和这一个:Destroying the WebView。这些都不适合我。
我真的很感谢一些帮助。

+2

请不要[删除和转贴问题](http://*.com/questions/41907714/webview-in-android-loading-stale-content)。只需使用任何新信息编辑原始帖子,就会将其置于活动队列的顶部。 –

+0

我明白,但我收录了一些我不应该拥有的东西。编辑也是行不通的,因为有人有机会看到它。所以我必须纠正并重新发布。 – ashishbahl

此问题可能是由于保存在您的Web视图的JavaScript饼干。在打开你的webview之前刷新cookies。

我想通了。因为在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