zoukankan      html  css  js  c++  java
  • onDestroy强制退出后,process crash的处理

     
     
    一般情况,我们在执行测试的过程中都会调用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.   }
    复制代码
     
     

  • 相关阅读:
    零基础学习java------day4------流程控制结构
    零基础学习java------day3-运算符 以及eclipse的使用
    [Codeforces Round #195 (Div. 2)] A. Vasily the Bear and Triangle
    [POJ] 1011 Sticks
    [Ioi2007]Miners 矿工配餐(BZOJ1806)
    [LA] 2031 Dance Dance Revolution
    [TYVJ] P1023 奶牛的锻炼
    ACM训练计划step 2 [非原创]
    ACM训练计划step 1 [非原创]
    [POJ] 1797 Heavy Transportation
  • 原文地址:https://www.cnblogs.com/melody-emma/p/4292592.html
Copyright © 2011-2022 走看看