10

我有一个显示网页的活动。在某些手机(例如,Huawei Ascend)上,此活动以导致应用程序重新启动的方式崩溃,但不会导致通常的 android 错误弹出窗口进行报告。(其他手机(例如 Nexus)根本不会崩溃。)它似乎总是在网页加载时崩溃,但不是在任何特定时间点,例如有时在 shouulOverrideUrlLoading 时,有时在 onPageStarted 或 onPageFinished 期间。

我认为 WebView 导致了这个——

08-29 21:08:22.577: A/libc(957): 致命信号 11 (SIGSEGV) 在 0x00000008 (code=1), 线程 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, String url) {
        Log.d("WEBVIEW", "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 视频的播放(我仍然有音频,但没有图像)。

4

2 回答 2

1

确保 WebView 是 RelativeLayout 的第一个元素。或者不使用RelativeLayout,试试LinearLayout。或者去掉WebView的属性android:layout_alignParentTop="true" android:layout_above="@id/webNavBar"

于 2014-04-11T08:58:28.617 回答
0
webSettings.setJavaScriptEnabled(true);

上述设置会导致"Fatal signal 11 (SIGSEGV)"某些使用 java 脚本的站点出错。我在三星 Galaxy Tab 3 和 Galaxy Tab 3 lite 上重现了这个错误。两种设备的 Android 版本均为 4.4.2。

如果我删除“setJavaScriptEnabled”功能,它工作正常。

于 2015-10-22T08:33:19.913 回答