Android Webview有时不加载HTML

时间:2016-05-07 15:35:32

标签: javascript android html cordova webview

我正在尝试在我的网页浏览中加载本地HTML内容。但有时它无法加载内容而是显示空白屏幕。它每5次加载就会发生一次。

注意我的HTML内容,我尝试加载的是Official 2048 Source code

以下是我的活动源代码

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

直到现在我已经尝试了以下方法来解决问题:

  1. 将硬件加速放在清单文件上。
  2. 在活动中启用和禁用硬件加速。
  3. 重新加载了shouldOverrideUrlLoading
  4. 中的相同网址
  5. 尝试在onStart()中加载URL而不是onCreate()
  6. 但似乎没有什么对我有用。

    我的日志:

    public class GameActivity extends AppCompatActivity {
    
    private WebView mWebView;
    
    @SuppressWarnings("ConstantConditions")
    @SuppressLint({ "SetJavaScriptEnabled", "NewApi", "ShowToast"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
    
        setContentView(R.layout.activity_game);
    
        Toolbar toolbar = (Toolbar) findViewById(R.id.game_toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                actionBar.setDisplayHomeAsUpEnabled(true);
            }
        }
    
        // Load webview with game
        mWebView = (WebView) findViewById(R.id.mainWebView);
        WebSettings settings = mWebView.getSettings();
        String packageName = getPackageName();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        settings.setDatabaseEnabled(true);
        settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
        if (Build.VERSION.SDK_INT >= 19) {
            // chromium, enable hardware acceleration
            mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        } else {
            // older android version, disable hardware acceleration
            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    
        // Since the database path is automatically handled by Chromium Webkit,
        // we should not mention the db path for greater than KitKat version
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            settings.setDatabasePath("/data/data/" + packageName + "/databases");
        }
        mWebView.addJavascriptInterface(new WebInterface2048(this), "Android");
        // If there is a previous instance restore it in the webview
        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {
            mWebView.loadUrl("file:///android_asset/2048/index.html");
        }
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    
    public class WebInterface2048 {
        Context mContext;
    
        public WebInterface2048(Context context) {
            mContext = context;
        }
    
        @JavascriptInterface
        public void showToast(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
    }
    }
    

    其他信息:我的设备是Moto G3(Android 6.0.1)

3 个答案:

答案 0 :(得分:4)

永远不明白为什么会这样。但作为一种解决方法,我使用下面的代码解决了这个问题:

mWebView.postDelayed(new Runnable() {

        @Override
        public void run() {
            mWebView.loadUrl("file:///android_asset/2048/index.html");
        }
    }, 500);

不是在主线程中加载URL,如果我在不同的线程中运行,它对我有效。

上述工作对于那些面临问题的人有帮助,他们的webview在第一次加载时显示为空白,在重新加载时会加载内容。

可能它不是一个概率=每个解决方案,但它有效。如果有人找到更好的解决方案,请发帖。

答案 1 :(得分:2)

我通过在onCreate方法中手动将WebView添加到布局中来解决了这个问题:

        LinearLayout ll = findViewById(R.id.content);
        WebView help = new WebView(this);
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        help.setLayoutParams(lp);
        ll.addView(help);

然后照常加载html:

        try {
             String base64 = Base64.encodeToString(sampleHtml.getBytes("UTF-8"), Base64.DEFAULT);
             help.loadData(base64, "text/html; charset=utf-8", "base64");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         } catch (Exception ex){
             ex.printStackTrace();
         }

答案 2 :(得分:0)

从其余代码中尝试此隔离。把它放在oncreate自己测试。 saveinstancestate并不总是为null,因此它不会加载。 mWebView.loadUrl("file:///android_asset/2048/index.html");