2017-11-22 17 views
1

私はViewPagerの項目としてwebViewを設定する必要がある1つのアプリケーションで作業しています。私は、私が持っているURLのarrayListのサイズとして毎回フラグメントのnewInstace()を作成して使用しました。 しかし、私はmPager.setOffscreenPageLimit(myArray.size())を設定すると、読み込むURLが20以上ありますので、負荷が大きすぎます。 mPager.setOffscreenPageLimit(1)を使用すると、毎回リロードされます。だから、毎回ウェブページの再ロードを防ぐ方法はありますか?ViewPagerに設定されたキャッシュからWebviewデータを読み込みます。

public static class PlaceholderFragment extends BaseFragment { 

    Activity activity; 
    private int media_position = 0; 
    private String media_url = ""; 

    private static final String KEY_CONTENT = "CategoriesFragment:Content"; 
    private String mContent = "???"; 

    public static PlaceholderFragment newInstance(int media_position, String media_url) { 

     PlaceholderFragment fragment = new PlaceholderFragment(); 
     fragment.media_position = media_position; 
     fragment.media_url = media_url; 
     return fragment; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString(KEY_CONTENT, mContent); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) { 
      mContent = savedInstanceState.getString(KEY_CONTENT); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     web1 = inflater.inflate(R.layout.fragment_main, container, false); 
     activity = getActivity(); 

     mWebView1 = (WebView) web1.findViewById(R.id.webview); 

     mWebView1.setWebViewClient(new WebViewClient()); 
     mWebView1.getSettings().setJavaScriptEnabled(true); 
     mWebView1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
     mWebView1.getSettings().setSupportMultipleWindows(true); 
     mWebView1.getSettings().setSupportZoom(true); 
     mWebView1.getSettings().setBuiltInZoomControls(false); 
     mWebView1.getSettings().setAllowFileAccess(true); 
     mWebView1.getSettings().setAppCacheEnabled(true); 
     mWebView1.getSettings().setDomStorageEnabled(true); 
     mWebView1.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 

     mWebView1.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 

       boolean isLoaded = false; 

       if (Utils.LoadedUrlList.containsKey(Utils.currentUrl)) { 
        Log.e("Matched key", "media_position --> " + media_position + " currentUrl --> " + Utils.currentUrl); 
        isLoaded = true; 
       } else { 
        Log.e("Not Matched", "media_position --> " + media_position + " media_url --> " + media_url); 
        isLoaded = false; 
       } 

       Log.e("onPageStarted", "onPageStarted"); 

       if (!isLoaded) 
        if (media_position == 0) 
         ShowProgressDialog(activity, activity.getString(R.string.loading)); 
      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 

       Log.e("onPageFinished", "onPageFinished"); 
       Log.e("onPageFinished", "--> " + url); 

       hideProgressDialog(); 
       CookieSyncManager.getInstance().sync(); 

       for (int i = 0; i < Utils.SocialURLList.size(); i++) { 

        if (url.equals(Utils.SocialURLList.get(i))) { 
         Utils.LoadedUrlList.put(Utils.SocialURLList.get(0), true); 
        } 
       } 
      } 
     }); 

     mWebView1.loadUrl(media_url); 
     return web1; 
    } 

} 

答えて

0
public void onPageFinished(WebView view, String url) { 
    CookieSyncManager.getInstance().sync(); 
} 

のWebViewがロードされ、呼び出されonPageFinishedたら、クッキーにデータを保存することができます。 他も同様です。webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

+0

は、どのように私は、クッキーから再びWebページをロードすることができますか? –

+0

webview.load(url)を呼び出すと、自動的に呼び出されます。 – Ameer

+0

また、webView.getSettings()を追加します。setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); – Ameer

0

私は同じことをしなければなりませんでした。私はonSaveInstanceStateにデータを保存してもスケールがうまくいかないことを発見しました(私は@Ameerによって提案されたクッキーメソッドを試しませんでした)。

あなたがHTMLをダウンロードした後、代わりに、あなたはこのようなファイルにHTMLを保存することができます:

try { 
     OutputStreamWriter outputStreamWriter = 
       new OutputStreamWriter(context.openFileOutput(email_id + ".txt", Context.MODE_PRIVATE)); 
     outputStreamWriter.write(email_body); 
     outputStreamWriter.close(); 
    } catch (IOException e) { 
     Log.e("Exception", "File write failed: " + e.toString()); 
    } 

ともSharedPreferencesの現在時刻とemail_idを節約します。

フラグメントが再度ロードされたときに、email_idSharedPreferencesに存在するかどうかを確認します。そうでない場合、またはそれで保存された時間が希望のキャッシュ長を超えている場合は、Webからページを(再)読み込みます。そうでなければ、この

public String getCachedHTML(String email_id) { 
    String ret = ""; 
    try { 
     InputStream inputStream = context.openFileInput(email_id + ".txt"); 

     ret = readFile(ret, inputStream); 
    } catch (FileNotFoundException e) { 
     Log.e("login activity", "Email cache not found: " + e.toString()); 
    } catch (IOException e) { 
     Log.e("login activity", "Can not read email cache: " + e.toString()); 
    } 
    return ret; 
}` 

などのキャッシュされたemail_bodyを呼び出すあなたは、このようなウェブビューでHTMLを設定することができます。

webView.loadData(email_body, "text/html; charset=UTF-8", null); 
+0

私の考えでは、私の場合はうまくいかないと思います。私はGmail、fbのwebページをロードする必要があるため –

関連する問題