我正在尝试在我的网页浏览中加载本地HTML内容。但有时它无法加载内容而是显示空白屏幕。它每5次加载就会发生一次。
注意我的HTML内容,我尝试加载的是Official 2048 Source code。
以下是我的活动源代码
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
直到现在我已经尝试了以下方法来解决问题:
但似乎没有什么对我有用。
我的日志:
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)
答案 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");