我遇到的问题是,有时当我在我的应用程序中打开webView活动时,它工作正常,有时会发生致命信号11并关闭应用程序
这是我的webView类
public class Browser extends Activity{
WebView ourBrow;
String adress;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.browser);
try{
try{
getActionBar().setDisplayShowHomeEnabled(false);
}
catch (Exception e)
{ }
ourBrow = (WebView)findViewById(R.id.wvBrowser);
ourBrow.getSettings().setJavaScriptEnabled(true);
ourBrow.getSettings().setLoadWithOverviewMode(true);
ourBrow.getSettings().setUseWideViewPort(true);
ourBrow.setWebViewClient(new ourViewClient());
ourBrow.setWebChromeClient(new WebChromeClient());
ourBrow.getSettings().setSupportMultipleWindows(true);
try{
Bundle gotBasket = getIntent().getExtras();
adress = gotBasket.getString("url");
}catch (Exception e){
}
try
{
ourBrow.loadUrl(adress);
}
catch (Exception e)
{
e.printStackTrace();
}
}catch(Exception e)
{
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
ourBrow.stopLoading();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_goback, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
// action when setting was selected
case R.id.goback:
finish();
break;
default:
break;
}
return true;
}
public class ourViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
}
public void clickEvent_live (View view)
{
if (!adress.contains("live"))
{
Intent intent_live = new Intent(this,Browser.class);
intent_live.putExtra("url", CommonUtilities.LIVE_URL);
startActivity(intent_live);
}
}
}
这是日志
并且这些警告也会出现
thx
答案 0 :(得分:2)
我认为您的问题出在您活动的onPause
上。首先,当你关闭你的活动时,你应该销毁你的WebView以确保它不会在内存中闲逛(在视频播放的情况下,它将继续在后台播放。
如果WebView为空,您需要签入onPause,因为三星设备不会总是正确地销毁对象......我只遇到三星设备的奇怪问题。
你的onPause应该如下:
@Override
protected void onPause() {
super.onPause();
if(ourBrow != null) {
ourBrow.stopLoading();
ourBrow.onPause(); //pauses background threads, stops playing sound
ourBrow.pauseTimers(); //pauses the WebViewCore
}
}
你的onOptionsItemSelected应如下(为了正确销毁WebView):
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.goback:
ourBrow.stopLoading();
ourBrow.onPause(); //pauses background threads, stops playing sound
ourBrow.pauseTimers(); //pauses the WebViewCore
ourBrow.destroyDrawingCache(); //removes the view from RAM
ourBrow = null; //you need to nullify the WebView because due to the odd way that the Activity lifecyle works, sometimes onPause is called when you start up your activity
finish();
break;
default:
break;
}
return true;
}
编辑:所以我记得我在三星设备上遇到的具体问题是,有时候尝试加载null或空网址会使应用程序崩溃,而不是抛出空指针异常。尝试将onCreate更改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.browser);
try{
try{
getActionBar().setDisplayShowHomeEnabled(false);
}
catch (Exception e)
{ }
ourBrow = (WebView)findViewById(R.id.wvBrowser);
ourBrow.getSettings().setJavaScriptEnabled(true);
ourBrow.getSettings().setLoadWithOverviewMode(true);
ourBrow.getSettings().setUseWideViewPort(true);
ourBrow.setWebViewClient(new ourViewClient());
ourBrow.setWebChromeClient(new WebChromeClient());
ourBrow.getSettings().setSupportMultipleWindows(true);
String url = null;
Intent intent = getIntent();
if(intent != null) {
if(intent.getExtras() != null) {
url = intent.getExtras().getString("url");
}
}
if(url != null && !url.equals("")) {
ourBrow.loadUrl(url);
}
} catch(Exception e) {
}
}
我不完全确定这是否有用,但这是帮助我解决错误的原因。
答案 1 :(得分:0)
除非您编写了自己的NDK代码,否则您作为Java开发人员无法做出任何导致SIGSEGV
的内容。
在运行相同API级别的模拟器中尝试您的项目。如果问题也出现在那里,那么问题肯定是Android,你可能想要file an issue一个示例项目和指令来重现崩溃。否则,您可能需要contact Samsung并向他们提供示例项目和说明。
答案 2 :(得分:0)
此解决方案
mWebView = new WebView(getApplicationContext());
mMainView.addView(mWebView);
@Override
protected void onPause() {
super.onPause();
if (mWebView != null) {
mWebView.stopLoading();
mWebView.onPause();
mWebView.pauseTimers();
}
}
@Override
public void finish() {
super.finish();
if (mWebView != null) {
mWebView.removeAllViews();
mMainView.removeView(mWebView);
mWebView.setTag(null);
mWebView.clearCache(true);
mWebView.destroyDrawingCache();
mWebView.destroy();
mWebView=null;
}
}
答案 3 :(得分:-1)
我遇到了类似的问题,你的研究确实帮助我理解了它的来源。 对我来说,只需将Web视图渲染优先级设置为低
即可webView.getSettings().setRenderPriority(RenderPriority.LOW);
我只能推测导致这种情况的原因,但是像JavaScript动画这样的接缝对于其余的UI线程花了太长时间。 遗憾的是,您无法从UI线程中取消Web视图。
我希望我的“解决方法”可以帮助很短的时间,但肯定不是解决方案。