我有一个显示网页的活动.在某些手机(例如华为Ascend)上,此操作会导致应用程序重新启动,但不会导致通常的
Android错误弹出窗口进行报告. (其他手机(例如Nexus)根本不会崩溃.)在网页正在加载时,它似乎总是会崩溃,但不会在任何特定的位置.有时在shoolOverrideUrlLoading,有时在onPageStarted或onPageFinished.
我认为WebView引起了这一点 –
08-29 21:08:22.577:A / libc(957):0x00000008(code = 1)的致命信号11(SIGSEGV),线程957
– 但是我不明白为什么.
这是活动:
public class WebDisplay extends Activity { private String sentUrl = ""; public WebView myWebView; public ProgressBar spinner; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("WEBVIEW","onCreate"); getWindow().setBackgroundDrawableResource(R.color.white); Bundle extras = getIntent().getExtras(); if (null != extras) { sentUrl = extras.getString("displayURL"); } setContentView(R.layout.webdisplay); myWebView = (WebView) findViewById(R.id.webDisplay); spinner = (ProgressBar) findViewById(R.id.webLoading); // WebView displays default to showing things in exact pixel size at 100% // resolution,meaning it generally opens on a zoomed in portion of the // top left of the web page and refuses to let you zoom out,so we have // to force it to display pages a bit more reasonably. myWebView.getSettings().setLoadWithOverviewmode(true); myWebView.getSettings().setUseWideViewPort(true); myWebView.getSettings().setPluginState(WebSettings.PluginState.ON); // By default,there is no javascript support or zoom controls,so // turn both of those on. WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // We want links to continue opening inside the app. myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { Log.d("WEBVIEW","loadUrl="+url); view.loadUrl(url); // open link in the same web view. return true; } @Override public void onPageStarted(WebView view,String url,android.graphics.Bitmap favicon) { Log.d("WEBVIEW","onPageStarted="+url); super.onPageStarted(view,url,favicon); if (View.GONE == spinner.getVisibility()) { spinner.setVisibility(View.VISIBLE); } } @Override public void onPageFinished(WebView view,String url) { Log.d("WEBVIEW","onPageFinished="+url); super.onPageFinished(view,url); if (View.VISIBLE == spinner.getVisibility()) { spinner.setVisibility(View.GONE); } } @Override public void onReceivedError(WebView view,int errorCode,String description,"onPageError="+url+"::descr="+description); } }); // Try to get YouTube videos working. myWebView.setWebChromeClient(new WebChromeClient() { }); // So the user doesn't have to back through their entire history to get // back to the app,we provide a "done browsing" button. Button doneButton = (Button) findViewById(R.id.doneButton); doneButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { finish(); } }); ImageButton backButton = (ImageButton) findViewById(R.id.webBackButton); backButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.goBack(); } }); ImageButton fwdButton = (ImageButton) findViewById(R.id.webForwardButton); fwdButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.goForward(); } }); ImageButton refreshButton = (ImageButton) findViewById(R.id.refreshButton); refreshButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { myWebView.reload(); } }); myWebView.loadUrl(sentUrl); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the state of the WebView myWebView.saveState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // Restore the state of the WebView myWebView.restoreState(savedInstanceState); } }
这里是加载的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" > <RelativeLayout android:id="@+id/webNavBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/abs__background_holo_light" android:layout_alignParentBottom="true" android:padding="2dp" > <Button android:id="@+id/doneButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/refreshButton" android:layout_alignTop="@+id/refreshButton" android:background="@drawable/custom_button" android:padding="5dp" android:text="@string/web_done" android:textColor="@color/white" android:textStyle="bold" /> <ImageButton android:id="@+id/refreshButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="@drawable/custom_button" android:src="@drawable/ic_action_refresh" android:contentDescription="@string/web_refresh" android:textColor="@color/white" android:padding="5dp" /> <ImageButton android:id="@+id/webBackButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginRight="5dp" android:layout_toLeftOf="@+id/webForwardButton" android:background="@drawable/custom_button" android:src="@drawable/navigation_back" android:padding="5dp" android:contentDescription="@string/web_back" android:textColor="@color/white" /> <ImageButton android:id="@+id/webForwardButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/custom_button" android:src="@drawable/navigation_forward" android:contentDescription="@string/web_forward" android:textColor="@color/white" android:padding="5dp" /> </RelativeLayout> <WebView android:id="@+id/webDisplay" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_above="@id/webNavBar" /> <ProgressBar android:id="@+id/webLoading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="80dp" style="@android:style/Widget.ProgressBar.Large" android:layout_centerHorizontal="true" /> </RelativeLayout>
ETA:关闭硬件加速
myWebView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
似乎停止SIGSEV的事情,但也停止YouTube视频播放(我仍然有音频,但没有图像).