3

I am trying to load html data onto a webview which works most of the time but on occasion, I have really long content and an out of memory exception is thrown when i try to load the data.

This is the logcat;

java.lang.OutOfMemoryError
       at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
       at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
       at java.lang.StringBuilder.append(StringBuilder.java:216)
       at com.radioafrica.mpasho.view.EntryView.generateHtmlContent(EntryView.java:195)
       at com.radioafrica.mpasho.view.EntryView.setHtml(EntryView.java:158)
       at com.radioafrica.mpasho.view.ArticleView.setArticleContent(ArticleView.java:212)
       at com.radioafrica.mpasho.view.ArticleView.setContent(ArticleView.java:142)
       at com.radioafrica.mpasho.fragment.EntryFragment$EntryPagerAdapter.displayEntry(EntryFragment.java:659)
       at com.radioafrica.mpasho.fragment.EntryFragment.onLoadFinished(EntryFragment.java:546)
       at com.radioafrica.mpasho.fragment.EntryFragment.onLoadFinished(EntryFragment.java:71)
       at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
       at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395)
       at android.support.v4.content.Loader.deliverResult(Loader.java:104)
       at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:73)
       at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35)
       at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:223)
       at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61)
       at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461)
       at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47)
       at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:5283)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
       at dalvik.system.NativeStart.main(NativeStart.java)

This is how I am loading my data:

 public void setHtml(long entryId, String contentText, String link) {
    if (PrefUtils.getBoolean(PrefUtils.DISPLAY_IMAGES, true) || !PrefUtils.getBoolean(PrefUtils.LITE_VERSION, false)) {
        contentText = HtmlUtils.replaceImageURLs(contentText, entryId);
        if (getSettings().getBlockNetworkImage()) {
            // setBlockNetwortImage(false) calls postSync, which takes time, so we clean up the html first and change the value afterwards
            loadData("", TEXT_HTML, Constants.UTF8);
            getSettings().setBlockNetworkImage(false);
        }
    } else {
        contentText = contentText.replaceAll(HTML_IMG_REGEX, "");
        getSettings().setBlockNetworkImage(true);
    }

    loadDataWithBaseURL("https://twitter.com/", generateHtmlContent(contentText, link), TEXT_HTML, Constants.UTF8, null);

private String generateHtmlContent(String contentText, String link) {
    String s[] = link.split("/");
    String identifier = s[s.length - 1];

    String comments = "<div id=\"disqus_thread\"></div>\n" +
            "\t<script type=\"text/javascript\">\n" +
            "\tvar disqus_shortname = 'mpashonews';\n" +
            "\n" +
            "\tvar disqus_identifier = '" + identifier + "';\n" +
            "\tvar disqus_title = 'Comments';\n" +
            "\t(function() {\n" +
            "\tvar dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n" +
            "\tdsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';\n" +
            "\t(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n" +
            "\t})();\n" +
            "\t</script>\n" +
            "\t<noscript>Please enable JavaScript to view the <a href=\"https://disqus.com/?ref_noscript\" rel=\"nofollow\">comments powered by Disqus.</a></noscript>";

    return CSS + BODY_START + contentText + "<br/>" + comments + BODY_END;
}

What is the best way to handle the large strings when loading the data?

Alex Kombo
  • 3,256
  • 8
  • 34
  • 67
  • we faced similar issues in past. Our issue was resolved using couple of options. You might want to try them. 1. Try android:largeHeap="true" 2. Use StringBuffer 3. Create a HTML file on SD card and send that file to Webview. – Amod Gokhale Jul 27 '15 at 10:44
  • Also Try to use ClearCache on webview – Amod Gokhale Jul 27 '15 at 10:49
  • have you faced this problem: http://stackoverflow.com/questions/24407411/native-crash-at-system-lib-libwebviewchromium-so-on-kitkat-android-4-4 ? I'm looking for a solution and everything appear to be related to the Memory Fail and i have big texts to and need correctly way to handle it – user2582318 Aug 13 '15 at 20:32

0 Answers0