一般情况,我们在执行测试的过程中都会调用tearDwon方法,以Robotium为例,我们在tearDown()方法中会执行solo.finishOpenedActivities()方法。
    有时候会发现当执行到这的时候,莫名的Process Crash了。后来仔细看了下finishOpenedActivities的源码,得出:执行该方法的时候会调用Instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK)。这就表明可能我们被测试的Activity可能会先执行完它的onStop和onDestroy方法。正常情况下是不会出现问题的,但是不正常的情况是我们的开发会做一些“额外”的操作。比如在onDestroy()方法中添加如下代码:
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
     这就使得应用程序会主动的kill掉自己的进程,因为我们的测试程序也是运行在这个进程中的。所以,就悲剧了。
     遇到这种情况的时候,记得主动在tearDown方法中去掉任何可能销毁当前Activity的代码,如去掉solo.finishOpenedActivities这个,就没有问题了。

@Override
protected void tearDown() throws Exception {
// Finish the Activity off (unless was never launched anyway)
Activity a = super.getActivity();
if (a != null) {
a.finish();
setActivity(null);
}
scrubClass(ActivityInstrumentationTestCase2.class);

super.tearDown();

}

这是tearDown()的源码,可以清晰的看到这里面执行了Activity的finish()方法,执行完后我们的测试程序就结束了。 Activity的finish()执行完后,此时Activity的状态先更改为onPause,然后待系统继续销毁Activity。

 
 
 
转自 http://www.robotium.cn/archives/915
 
 
 
 
crash主要原因有两个:
  1.用Robotium测试框架跑多个用例(写在同一个类里),只有第一个通过,第二个会卡顿, 导致crash
  原因是若同一个类里写多个测试方法,每个测试方法都会执行一次setUp() 和tearDown()方法,
  所以每一个用例开始时都是用的同一个启动Activity,
  如果你上一个用例退出时没有返回到那个Activity,执行下一个用例时会找不到启动Activity,就报错了
  解决方法:
  在tearDown()里加上返回到开始Activity的方法:solo.goBackto("startActivity");
  2.再跑时,发现程序还是会卡在第一个用例结束时无法退出,再检查,
  tearDown方法写错了,之前按照网上资料写的,并不好使,还是会引起崩溃

  1.   @Override
  2.   public void tearDown() throws Exception {
  3.   try {
  4.   solo.finalize();// 执行清理工作
  5.   } catch (Throwable e) {
  6.   e.printStackTrace();
  7.   }
  8.   Activity myActivity=getActivity();
  9.   if(myActivity!=null)
  10.   myActivity.finish();// 测试结束,关闭应用程序
  11.   super.tearDown();
  12.   }

复制代码

  把关闭方法修改成solo.finishOpenedActivities(); OK了,至于为什么我也没有研究,有谁知道的还请留言告诉我,不胜感激~
  最后,我的工程整个tearDown方法如下:

  1.   @Override
  2.   public void tearDown() throws Exception {
  3.   //关闭之前先回到主页面
  4.   Boolean notClosed = true;
  5.   while (notClosed) {
  6.   solo.goBack();
  7.   if (solo.waitForText("确定退出客户端吗", 1, 100, false, true)) {
  8.   notClosed = false;
  9.   solo.clickOnButton("取消");
  10.   break;
  11.   }
  12.   }
  13.   //关闭
  14.   try {
  15.   this.solo.finishOpenedActivities();
  16.   } catch (Throwable e) {
  17.   e.printStackTrace();
  18.   }
  19.   Activity myActivity=getActivity();
  20.   if(myActivity!=null)
  21.   myActivity.finish();
  22.   super.tearDown();
  23.   }

复制代码

 
 

onDestroy强制退出后,process crash的处理的更多相关文章

  1. asp.net网站后台退出后,点后退按钮仍能进,如何安全退出

    用户登录成功后,将用户名保存Session Session["usrename"]=username; 退出后Sessssion["username"]=str ...

  2. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    问题背景 C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了.于是C#小白的我天真的以为只要调用C#端的S ...

  3. webview中播放视屏,返回或者退出后,仍然会有声音。

    解决办法: protected void onPause() { super.onPause(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODE ...

  4. P2P头部平台退出后,普通人如何避开投资理财的“雷区”?

    编辑 | 于斌 出品 | 于见(mpyujian) 近期,P2P市场上不断传来不利消息,引起市场轩然大波,也打乱了投资者投资计划,是继续坚持自己的选择还是另择它路? 18日,陆金所作为千亿头部平台,宣 ...

  5. mac下firefox复制粘贴失效解决办法

    现象:复制粘贴只能在firefox上操作,也就是其他应用内的内容无法复制到firefox,firefox的内容也无法复制其他应用,但是firefox自己的内容可以复制本身(比如各个tab页之间复制) ...

  6. centOS7.3新安装后,设置IP,以及Putty远程和Xshell远程 (学习是个持续的过程,也许中途放松过,但是仍然能重新捡起来,并学以致用,方为真勇士)

    有一段时间没有写学习心得了:现在开始加油,再接再励. 从最基础的开始 1.安装centOS7.3之后设置IP地址.一般linux的系统都是作为服务器的系统来使用,服务器的属性注定了他的IP不能随意的更 ...

  7. 20155312 张竞予 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 目录 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 实验总结与体会 实践过程记录 (1)简单应用SET工具建 ...

  8. 如何使用Vue-cli搭建和运行vue项目

    此文章  主要参考:https://jingyan.baidu.com/article/5225f26bbb430fe6fa0908ce.html 在vue init webpack my-proje ...

  9. 在vue init webpack my-project卡住的问题

    在安装完node.js后,也用cnpm代替了npm,然后使用cnpm在node.js的安装路径下安装了vue-cli:cnpm install --global vue-cli.然后使用vue ini ...

随机推荐

  1. linux秘钥分发

    秘钥分发 ssh-copy-id -i /root/.ssh/id_rsa.pub "-p 9000 root@192.168.1.100" 传送文件 scp -P9000 -rp ...

  2. mac 监控文件变化并重启php

    自己撸一个框架,需要监控代码变化 安装fswatch brew install fswatch shell重启PHP脚本reload.sh #!/bin/sh do ps -ef | grep php ...

  3. 【HIHOCODER 1049】 后序遍历

    描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节 ...

  4. SpringMVC最核心

    如图所示:

  5. python基础——8(装饰器)

    一.nonlocal关键字 def outer(): num = 0 def inner(): # 如果想在被嵌套的函数中修改外部函数变量(名字)的值 nonlocal num # 将 L 与 E(E ...

  6. JS获取所有LI中第三个<SPAN>

  7. 表连接sql执行计划学习

    循环嵌套连接(Nested Loop Join) 合并连接(Merge Join) 哈西匹配(Hash Join) 文章:浅谈SQL Server中的三种物理连接操作 循环嵌套,如果内循环列上有索引, ...

  8. hdu 3879 最大密集子图(点和边均带权)(模板)

    /* 最大权闭合图,可以用最大密集子图来解速度更快复杂度低 题解:胡伯涛<最小割模型在信息学竞赛中的应用> 点和边均带权的最大密集子图 s-i,权为U=点权绝对值和+边的所有权值 i-t, ...

  9. jsp动态页面访问报错:HTTP Status 500 - java.lang.NullPointerException,org.apache.jasper.JasperException: java.lang.NullPointerException

    今天把项目导入进去一个新的项目中去结果出现了: org.apache.jasper.JasperException: java.lang.NullPointerException 错误,jsp居然访问 ...

  10. HDU 1024 Max Sum Plus Plus【DP,最大m子段和】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意: 给定序列,给定m,求m个子段的最大和. 分析: 设dp[i][j]为以第j个元素结尾的 ...