gpt4 book ai didi

javascript - Android Webview 有时不加载 HTML

转载 作者:太空狗 更新时间:2023-10-29 15:04:20 25 4
gpt4 key购买 nike

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

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

下面是我的Activity源码

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();
}
}
}

到目前为止,我已经尝试了以下方法来解决问题:

  1. 将硬件加速放在 list 文件中。
  2. 在 Activity 中启用和禁用硬件加速。
  3. 在 shouldOverrideUrlLoading 中重新加载相同的 URL
  4. 试图在 onStart() 而不是 onCreate() 中加载 URL

但似乎没有什么对我有用。

我的日志:

D/OpenGLRenderer: endAllActiveAnimators on 0xb7d7e248 (RippleDrawable) with handle 0xb76b0cf0
I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
D/cr_Ime: [InputMethodManagerWrapper.java:30] Constructor
W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: false
I/cr_Ime: ImeThread is not enabled.
W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 18631
D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: true
D/cr_Ime: [InputMethodManagerWrapper.java:68] hideSoftInputFromWindow
D/OpenGLRenderer: endAllActiveAnimators on 0xb7a893f8 (RippleDrawable) with handle 0xb7ec8810
I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
D/cr_Ime: [InputMethodManagerWrapper.java:30] Constructor
W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: false
I/cr_Ime: ImeThread is not enabled.
W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 18631
D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: true
D/cr_Ime: [InputMethodManagerWrapper.java:68] hideSoftInputFromWindow

附加信息:我的设备是 Moto G3 (Android 6.0.1)

最佳答案

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

mWebView.postDelayed(new Runnable() {

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

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

上述变通办法可以帮助那些遇到问题的人,他们的 webview 在第一次加载时显示空白,而在重新加载时,它会加载内容。

可能不是 prob=per 解决方案,但它确实有效。如果有人找到更好的解决方案,请发布。

关于javascript - Android Webview 有时不加载 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37090396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com