我已将MathJax放入我的项目中以在我的应用程序上显示数学方程式,它似乎正在工作,但是,在某些情况下它无法加载。我无法重现它何时发生,因为它是随机发生的。
我可以在WebView中看到正在加载MathJax,但偶尔也找不到乳胶代码 - 它不会使乳胶代码变灰,它只是忽略它并显示它原始。但是当我尝试加载相同的代码时,下次尝试时会让我感到困惑 - Mathjax找到并正确显示它。
SIDE NOTE
我正在使用具有Fragment ViewPager的Activity,并且在这些片段中,正在创建加载MathJax的WebView。有趣的是 - 当我开始活动时(片段和Webview立即与其他视图一起创建)。在一些性能较低的设备上,它永远不会在第一页上显示乳胶代码(乳胶不会灰显,即使MathJax被加载也会显示原始代码)。
我想要加载MathJax的活动还有一些内存很重要的东西,比如位图(在通过ViewPager销毁项目时会被回收)。
这让我觉得可能是由于某种延迟,它无法加载?
将MathJax加载到WebView中的CODE :
public static void createWebView(WebView view,String questionHtml) {
// i get string in HTML format so i parse it here
// HTML example code: "<p>This is the equation that is being sent: <span class="math-tex">\(x = {-b \pm \sqrt{b^2-4ac} \over 2a}\)</span></p>"
final String question = Html.fromHtml(questionHtml).toString();
final WebView w = view;
w.setVisibility(View.VISIBLE);
w.getSettings().setJavaScriptEnabled(true);
w.loadDataWithBaseURL("http://bar/", "<script type='text/x-mathjax-config'>"
+ "MathJax.Hub.Config({ "
+ "showMathMenu: false, "
+ "jax: ['input/TeX','output/HTML-CSS'], "
+ "extensions: ['tex2jax.js'], "
+ "TeX: { extensions: ['AMSmath.js','AMSsymbols.js',"
+ "'noErrors.js','noUndefined.js'] } "
+ "});</script>"
+ "<script type='text/javascript' "
+ "src='file:///android_asset/MathJax/MathJax.js'"
+ "></script><span id='math'></span>", "text/html", "utf-8", "");
w.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (!url.startsWith("http://bar")) {
return;
}
if (android.os.Build.VERSION.SDK_INT < 19) {
w.loadUrl("javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);");
w.loadUrl("javascript:document.getElementById('math').innerHTML='"
+ doubleEscapeTeX(question)
+ "';");
} else {
w.evaluateJavascript("javascript:MathJax.Hub.Queue(['Typeset',MathJax.Hub]);",null);
w.evaluateJavascript("javascript:document.getElementById('math').innerHTML='"
+ doubleEscapeTeX(question)
+ "';",null);
}
}
});
}
奖金问题有没有办法隐藏在WebView中显示状态的加载信息?
获得奖金的问题在Peter Krautzberger的帮助下,只需添加:
在+ "messageStyle: 'none', "
下方的网址中 + "MathJax.Hub.Config({ "
更新
现在我可以100%确认MathJax的加载可能性完全依赖于设备性能,我一直在尝试:
三星Galaxy Note 10(约80%的加载机会)
三星Nexus 5(50%几率)
和中兴Blade G(几乎从不)
此外,经过一些研究,我发现一些问题,加载MathJax的多个WebView无法同时加载到同一个活动中,这使我得出某种结论,即WebView的优化程度很低。如果我错了或者我的加载代码是坏的(我真的希望它是),请纠正我。
最糟糕的是,有很多问题没有任何明确的答案,为什么会发生这种情况。
部分解决方案
开始使用MathView库并从MathJax更改为KaTex,它似乎加载速度更快,所有设备都有100%的机会。副作用是KaTex有点丑陋,但它在一天结束时完成了它的工作。