android中activity.app.activitythread.handledestroyactivity

GoogleAdMobAdsSdk-4.3.1.jar
AdWhirlSDK_Android_3.1.1.jar
&coding-1 lang="other"&
&/coding& 2. 代码LinearLayout adViewLayout =(LinearLayout)this.findViewById(R.id.adView_layout);
AdWhirlLayout adWhirlLayout = new AdWhirlLayout(this, "MY_AD_UNIT_ID");
AdWhirlManager.setConfigExpireTimeout(45*1000);
adViewLayout.addView(adWhirlLayout);
出现Bug的位置在onDestroy, 但是中国地区的广告在某天出现过该Bug,第二天后就暂时没出现了。从Bug收集上看,其他地区的客户端出现该Bug的几率非常大。下面是Bug Log:java.lang.RuntimeException: Unable to destroy activity : java.lang.NullPointerException at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3661) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3679) at android.app.ActivityThread.access$2900(ActivityThread.java:126) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4633) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.webkit.WebView.requestFocus(WebView.java:7410) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1029) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1029) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1029) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1029) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1029) at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1073) at android.view.ViewGroup.requestFocus(ViewGroup.java:1032) at android.view.View.requestFocus(View.java:3556) at android.view.ViewRoot.clearChildFocus(ViewRoot.java:1586) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.clearChildFocus(ViewGroup.java:508) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2207) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2181) at android.view.ViewGroup.removeView(ViewGroup.java:2129) at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(Unknown Source) at android.support.v4.app.FragmentActivity.onDestroy(Unknown Source) at xx.xxx.xxx.xxx.xxxActivity.onDestroy(Unknown Source) at ...
目前还不能准确定位问题所在,暂时处理方式为:在onPause时、或者在super.onDestroy前移除广告的View。
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
这个问题出现点比较狭窄,主要是admob4.3.1sdk上显现较多,主要可能是系统次啊用回调机制的时候,发现被调用的对象已经被destory.
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (6261) 次trackbacks-0
如有转载,请声明出处: 时之沙:&
Android WebView常见问题解决方案汇总:
就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了web app与native app之间孰优孰劣的争论. 于是乎,一种混合型的app诞生了,灵活多变的部分,如淘宝商城首页的活动页面,一集凡客诚品中我们都可以见到web 页面与native页面的混合,既利用了web app的灵活易更新,也借助了native app本身的效率.当然,就会用到webview这样的一个控件,这里,我把自己使用过程中遇到的一些问题整理下来.
首先上张图对WebView进行一个基本的回顾:
以上思维导图原文件下载地址:
然后看一下具体的问题及解决方案:
1.为WebView自定义错误显示界面:
覆写WebViewClient中的onReceivedError()方法:
protected&void&showErrorPage()&{&&
&&&&LinearLayout&webParentView&=&(LinearLayout)mWebView.getParent();&&
&&&&initErrorPage();&&
&&&&while&(webParentView.getChildCount()&&&1)&{&&
&&&&&&&&webParentView.removeViewAt(0);&&
&&&&LinearLayout.LayoutParams&lp&=&new&LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);&&
&&&&webParentView.addView(mErrorView,&0,&lp);&&
&&&&mIsErrorPage&=&&&
protected&void&hideErrorPage()&{&&
&&&&LinearLayout&webParentView&=&(LinearLayout)mWebView.getParent();&&
&&&&mIsErrorPage&=&&&
&&&&while&(webParentView.getChildCount()&&&1)&{&&
&&&&&&&&webParentView.removeViewAt(0);&&
&&&protected&void&initErrorPage()&{&&
&&&&if&(mErrorView&==&null)&{&&
&&&&&&&&mErrorView&=&View.inflate(this,&R.layout.online_error,&null);&&
&&&&&&&&Button&button&=&(Button)mErrorView.findViewById(R.id.online_error_btn_retry);&&
&&&&&&&&button.setOnClickListener(new&OnClickListener()&{&&
&&&&&&&&&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&&&&&&&mWebView.reload();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&&&&&mErrorView.setOnClickListener(null);&&
@Override&&
public&void&onReceivedError(WebView&view,&int&errorCode,&String&description,&String&failingUrl)&{&&
&span&style="white-space:pre"&&&&&&&&&&&&&&&&&&&&/span&&&
&span&style="white-space:pre"&&&&&&&&&&&&/span&mErrorView.setVisibility(View.VISIBLE);&&
&span&style="white-space:pre"&&&&&&&&&&&&/span&super.onReceivedError(view,&errorCode,&description,&failingUrl);&&
}&&&&&&&&&&
2.WebView cookies清理:
CookieSyncManager.createInstance(this);&&&
CookieSyncManager.getInstance().startSync();&&&
CookieManager.getInstance().removeSessionCookie();&&&
3.清理cache 和历史记录:
webView.clearCache(true);&&&
webView.clearHistory();&&
4.判断WebView是否已经滚动到页面底端:
getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.&&&
getHeight()或者getBottom()方法都返回当前WebView&这个容器的高度&&&
getContentHeight&返回的是整个html&的高度,但并不等同于当前整个页面的高度,因为WebView&有缩放功能,&所以当前整个页面的高度实际上应该是原始html&的高度再乘上缩放比例.&因此,更正后的结果,准确的判断方法应该是:&&&
if(WebView.getContentHeight*WebView.getScale()&==&(webview.getHeight()+WebView.getScrollY())){&
5.URL拦截:
Android WebView是拦截不到页面内的fragment跳转的。但是url跳转的话,又会引起页面刷新,H5页面的体验又下降了。只能给WebView注入JS方法了。
&6.处理WebView中的非超链接请求(如Ajax请求):&
&有时候需要加上请求头,但是非超链接的请求,没有办法再shouldOverrinding中拦截并用webView.loadUrl(String url,HashMap headers)方法添加请求头
& 目前用了一个临时的办法解决:
首先需要在url中加特殊标记/协议, 如在onWebViewResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾
在shouldInterceptRequest()方法中,可以拦截到所有的网页中资源请求,比如加载JS,图片以及Ajax请求等等
@SuppressLint("NewApi")&&
@Override&&
public&WebResourceResponse&shouldInterceptRequest(WebView&view,String&url)&{&&
&&&&String&ajaxUrl&=&&&
&&&&if&(url.contains("req=ajax"))&{&&
&&&&&&&ajaxUrl&+=&"&imei="&+&&&
&&&&return&super.shouldInterceptRequest(view,&ajaxUrl);&&
7.在页面中先显示图片:
@Override&&
public&void&onLoadResource(WebView&view,&String&url)&{&&
&&mEventListener.onWebViewEvent(CustomWebView.this,&OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE,&url);&&
&&&&if&(url.indexOf(".jpg")&&&0)&{&&
&&&&&hideProgress();&
&&&&&mEventListener.onWebViewEvent(CustomWebView.this,&OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS,&view.getUrl());&&
&&&&super.onLoadResource(view,&url);&&
&8.屏蔽掉长按事件 因为webview长按时将会调用系统的复制控件:&& &&&
mWebView.setOnLongClickListener(new&OnLongClickListener()&{&&
&&&&&&&&&&&&
&&&&&&&&&&@Override&&
&&&&&&&&&&public&boolean&onLongClick(View&v)&{&&
&&&&&&&&&&&&&&return&&&
&&&&&&&&&&}&&
&&&&&&});&&
9.在WebView加入 flash支持:
String&temp&=&"&html&&body&bgcolor=\""&+&"black"&&
&&&&&&&&&&&&&&&&+&"\"&&&br/&&embed&src=\""&+&url&+&"\"&width=\""&+&"100%"&&
&&&&&&&&&&&&&&&&+&"\"&height=\""&+&"90%"&+&"\"&scale=\""&+&"noscale"&&
&&&&&&&&&&&&&&&&+&"\"&type=\""&+&"application/x-shockwave-flash"&&
&&&&&&&&&&&&&&&&+&"\"&&&/embed&&/body&&/html&";&&
String&mimeType&=&"text/html";&&
String&encoding&=&"utf-8";&&
web.loadDataWithBaseURL("null",&temp,&mimeType,&encoding,&"");&&
10.WebView保留缩放功能但隐藏缩放控件:
mWebView.getSettings().setSupportZoom(true);&&
&&&&&&&&mWebView.getSettings().setBuiltInZoomControls(true);&&
&&&&&&&&if&(DeviceUtils.hasHoneycomb())&&
&&&&&&&&&&&&&&mWebView.getSettings().setDisplayZoomControls(false);&&
注意:setDisplayZoomControls是在Android 3.0中新增的API.
这些是目前我整理出来的一些注意事项和问题解决方案,也欢迎大家多提一些关于webview的问题,如果有合适的解决方案,我会直接更新到这篇文章.
8月份更新:
11.WebView 在Android4.4的手机上onPageFinished()回调会多调用一次(具体原因待追查)
需要尽量避免在onPageFinished()中做业务操作,否则会导致重复调用,还有可能会引起逻辑上的错误.
12.需要通过获取Web页中的title用来设置自己界面中的title及相关问题:
需要给WebView设置 WebChromeClient,并在onReceiveTitle()回调中获取
WebChromeClient&webChromeClient&=&new&WebChromeClient()&{&&&&
&&&&&&&&&&&&@Override&&&&
&&&&&&&&&&&&public&void&onReceivedTitle(WebView&view,&String&title)&{&&&&
&&&&&&&&&&&&&&&&super.onReceivedTitle(view,&title);&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&txtTitle.setText(title);&&&&
&&&&&&&&&&&&}&&&&
&&&&&&&&};&&&&
但是发现在小米3的手机上,当通过webview.goBack()回退的时候,并没有触发onReceiveTitle(),这样会导致标题仍然是之前子页面的标题,没有切换回来.
这里可以分两种情况去处理:
(1) 可以确定webview中子页面只有二级页面,没有更深的层次,这里只需要判断当前页面是否为初始的主页面,可以goBack的话,只要将标题设置回来即可.
(2)webview中可能有多级页面或者以后可能增加多级页面,这种情况处理起来要复杂一些:
&&& 因为正常顺序加载的情况onReceiveTitle是一定会触发的,所以就需要自己来维护webview& loading的一个url栈及url与title的映射关系
&& 那么就需要一个ArrayList来保持加载过的url,一个HashMap保存url及对应的title.
&& 正常顺序加载时,将url和对应的title保存起来,webview回退时,移除当前url并取出将要回退到的web 页的url,找到对应的title进行设置即可.
这里还要说一点,当加载出错的时候,比如无网络,这时onReceiveTitle中获取的标题为 找不到该网页,因此建议当触发onReceiveError时,不要使用获取到的title.
13.WebView因addJavaScriptInterface()引起的安全问题.
&&& 这个问题主要是因为会有恶意的js代码注入,尤其是在已经获取root权限的手机上,一些恶意程序可能会利用该漏洞安装或者卸载应用.
关于详细的情况可以参考下面这篇文章:
还有一个开源项目可以参考:&, 该项目利用onJsPrompt() 替代了addJavaScriptInterface(),(解决方案类似上述参考的博客)同时增加了异步回调,
很好地解决了webview &js注入的安全问题.
10月份更新:
14.WebView页面中播放了音频,退出Activity后音频仍然在播放
需要在Activity的onDestory()中调用
webView.destroy();&&
但是直接调用可能会引起如下错误:
10-10&15:01:11.402:&E/ViewRootImpl(7502):&sendUserActionEvent()&mView&==&null&&
10-10&15:01:26.818:&E/webview(7502):&java.lang.Throwable:&Error:&WebView.destroy()&called&while&still&attached!&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.webkit.WebViewClassic.destroy(WebViewClassic.java:4142)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.webkit.WebView.destroy(WebView.java:707)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&com.didi.taxi.ui.webview.OperatingWebViewActivity.onDestroy(OperatingWebViewActivity.java:236)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.Activity.performDestroy(Activity.java:5543)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1134)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3619)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3654)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.ActivityThread.access$1300(ActivityThread.java:159)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.os.Handler.dispatchMessage(Handler.java:99)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.os.Looper.loop(Looper.java:137)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&android.app.ActivityThread.main(ActivityThread.java:5419)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&java.lang.reflect.Method.invokeNative(Native&Method)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&java.lang.reflect.Method.invoke(Method.java:525)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)&&
10-10&15:01:26.818:&E/webview(7502):&&&&at&dalvik.system.NativeStart.main(Native&Method)&&
如上所示,webview调用destory时,webview仍绑定在Activity上.这是由于自定义webview构建时传入了该Activity的context对象,因此需要先从父容器中移除webview,然后再销毁webview:
rootLayout.removeView(webView); &
阅读(...) 评论()at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 该如何解决?_百度知道
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 该如何解决?
2663)该如何解决.ActivityTAndroidRuntime(339):
at android.java11-28 12.458.performLaunchActivity(ActivityThread: ERROR&#47.app:51:09
我有更好的答案
javaat android。改用 getLastKnownLocation(LocationManager.ActivityThread,没有实质解决:2663之前我也有遇到过.performLaunchActivity(ActivityThread.app
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 1682|回复: 3
Landroid/app/ActivityThread$PackageInfo$ServiceDispatcher$DeathMonitor
主题帖子e币
没有eoe的账号,级别还太低,出门如何吹牛逼?
才可以下载或查看,没有帐号?
Landroid/app/ActivityThread$PackageInfo$ServiceDispatcher$DeathMonitor
这东西是什么?
一般会在什么情况下被用到?
全局引用超过最大限制
主题帖子e币
兄弟 这个问题已经有很多人问了 暂时没有人会&&敬请期待
主题帖子e币
高手来讲讲吧...
主题帖子e币
已经解决了 ,全局引用溢出,全局引用要记得释放。
推荐阅读热门话题
6246324582060198318101792147213021104944785763706698715
半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前半小时前
特别关注 /3
从基础入门到熟练精通,9个阶段知识体系图指引你逐步提升~还有技术问答+讲师互动,最新实战教程每日更新!
极客学院新版上线,提供了更加完善的知识体系和用户体验,eoe用户注册成为极客学院会员即可获得15天VIP,让你一次学个够!
eoe联合听云年终征文送豪礼,魅蓝手机,机械键盘,Android书籍,极客学院月VIP学习权限(注册即送)……众多大奖拿到手软,抓紧来参与吧
Powered by
扫一扫 关注eoe官方微信Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.
Im using a few sensors - MediaRecorder and MediaPlayer, NotificationManager, a WakeLock, and LocationListener...
Here is my onResume() and onPause() functions:
void onResume() {
super.onResume();
//GPS Sensor
locationListener = new MyLocationListener();
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, locationListener);
// Notification Manager
gNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
gNotification = new Notification();
gNotification.vibrate = gV
void onPause() {
super.onPause();
// Release the Recorder
if (mRecorder != null) {
mRecorder.release();
mRecorder =
// Release the Media Player
if(mPlayer != null) {
mPlayer.release();
// Release Power Manager
wake.Stop();
// Release Location Listener
locationManager.removeUpdates(locationListener);
locationManager =
And here's the Logcat output...
threadid=1: thread exiting with uncaught exception
(group=0x)
FATAL EXCEPTION: main
android.app.SuperNotCalledException: Activity
{changethispackage.beforesubmitting.tothemarket.sonicdrift/
changethispackage.beforesubmitting.tothemarket.sonicdrift.SonicDrift}
did not call through to super.onStop()
at android.app.Activity.performStop(Activity.java:3875)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2619)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2690)
at android.app.ActivityThread.access$2100(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:964)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native
Method) W/InputManagerService(
96): Window already focused, ignoring
focus gain of:
com.android.internal.view.IInputMethodClient$Stub$Proxy@
I/Process (17118): Sending signal. PID: 17118 SIG: 9
I/ActivityManager(
96): Process
changethispackage.beforesubmitting.tothemarket.sonicdrift (pid 17118)
has died. I/WindowManager(
96): WIN DEATH: Window{40958d98
changethispackage.beforesubmitting.tothemarket.sonicdrift/changethispackage.
beforesubmitting.tothemarket.sonicdrift.SonicDrift
paused=false} I/WindowManager(
96): WIN DEATH: Window{40991f90
SurfaceView paused=false}
How do I fix this error? I've tried to
add super.onStop() to my onPause().
19.6k10104114
You need to make sure that you have (super.onStop and super.onDestroy) in your overridden methods. This is could be a good candidate for the problem you have:
protected void onStop() {
Log.w(TAG, "App stopped");
super.onStop();
protected void onDestroy() {
Log.w(TAG, "App destoryed");
super.onDestroy();
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Stack Exchange
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled

我要回帖

更多关于 android中activity 的文章

 

随机推荐