“XXX停止运行”问题解决

关于手机PDA换了型号导致APP部分按钮点击闪退的问题

前段时间工作上遇到一个问题,过去了几个星期了,一直没时间整理,今天得空记录一下。
问题是关于公司上古流传下来的一个陈旧的项目,同事换了其他厂家的手机PDA后使用,并且android版本从原来的4.3.1变成4.4.4后,APP出现闪退的问题,点击其中部分按钮就会弹出“XXapp停止运行”的提醒,我需要查找原因解决这个问题,LogCat报以下异常:
在这里插入图片描述
在这里插入图片描述

解决问题的心路历程

问题到我手上的时候,唯一传达到的信息就是扫描头调用有问题,android版本升级导致app版本不匹配,不知道这是老大的预判还是前开发者给出的反馈。到我手上后首先在adt-bundle(虽然这个IDE有点过时,现在都使用Android Studio的多,不过确实很好用,不用过多配置打开eclipse就可以用起来,如果要使用模拟器,无非是多下载一个相应版本的system-image和platforms放在sdk中)上把项目跑起来。

  • 真机调试时登录都是正常的,到了主页面点击按钮的时候出现了闪退,并且APP被强制停止运行
    首先都还没到扫描邮件号这一个步骤,就已经出现了异常,无法说通过改代码去判断是否广播这一块有问题;再者我配置了4.3.1的模拟器,在电脑上运行,出现的是和真机调试一模一样的异常,所以排除是android升级而导致的问题。
    询问了一个专门做android开发的朋友,看了我的异常信息后,判断可能是adt-bundle这个IDE过于老旧,缺少一些必要的插件,导致运行异常,建议我安装最新版的Android Studio,跑一下试试。没想到这又是一条看不到头的路,一路安装下来很顺利,包括配置模拟器和sdk,然而手上的adt项目要转成gradle项目导入到Android Studio中的话,总是会创建失败,虽然根据网上的方法对项目进行了转化,还是不行,Android Studio也重装了无数次,甚至还专门fq去装AS,怕安装过程中由于国内网络问题漏下载东西,无果。。。同事也说,我这个应该就是ide配置的问题!
    冷静下来想想,感觉目前有点偏离解决问题的主线了,第一,需要解决的问题是PDA硬件和apk软件的匹配问题,在换了机子前一直是正常的,换了机子后才出现问题,说明软件是不会有问题的;第二,PDA是新的更不会有问题,只是匹配有问题;第三,更加不可能是我IDE导致了这个异常,即使有,也应该在解决软硬件匹配问题后,再最后来考虑IDE的问题,毕竟已经在adt-bundle上已经可以跑起来了,为什么不能从此先入手???

  • 页面跳转的逻辑是否有问题
    所以根据自己的直觉判断,改变了查找问题的方向,从当下最直白的问题入手,点击按钮只是实现页面跳转而已,并没有其他任何操作,既然这时闪退,是不是页面跳转写的不对。好的,立马根据原开发者的写法写了一个空白页面的跳转,咦?非常流畅和正常,并无任何问题,所以并不是页面跳转的问题,排除。。。
    至此,我极度怀疑是不是原开发者打包项目的时候,漏了什么jar包,封装类。通过曲折的过程联系到了原开发者,首先确认项目是完整的,然后指了一条路,应该是换了新机子后硬件不一样,原先的调用方法是不可用的了,应该根据新机子的硬件重新开发部分功能,联系现厂家获取匹配的SDK,哇,瞬间看到了胜利的曙光。
    而后从厂家得到的sdk无非就是广播名称和接受码值字段这些东西,就是一个扫描广播而已啊。在空白页面里测试了一番,果然可以正常扫描了,好吧,进入源代码改成自己例子写的扫描方式吧!然而又回到老问题,目前是页面跳转就直接出问题了,谈何扫描???继续顺藤摸瓜地尝试。。。

  • 跳转后的页面预加载的内容是否有问题
    页面跳转的下一步自然是加载新页面了,那问题很可能就出在新页面上吧,火速把新页面的后端代码调出来,emmmm,然后是在onResume()中发现了一些不明所以的东西如下所示:

	private ScanManager mScanManager;
	private SoundPool soundpool = null;
	
	@Override
	protected void onResume() {
		super.onResume();
		initScan();
		IntentFilter filter = new IntentFilter();
		filter.addAction(SCAN_ACTION);
		registerReceiver(mScanReceiver, filter);
	}
	private void initScan() {
		mScanManager = new ScanManager();
		mScanManager.openScanner();
		soundpool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 100); // MODE_RINGTONE
		soundid = soundpool.load("/etc/Scan_new.ogg", 1);
	}

所以是initScan()中调用了一些新PDA没有的硬件,比如上面的ScanManager和SoundPool,把调用initScan()部分注释掉,再运行居然就可以正常跳转了,天哪,一把辛酸泪!!!不过,当跳转到新页面后使用扫描功能时,还是会发生闪退的异常,不过这次只是跳回主界面,而没有使得APP强制停止运行。好的,现在思路终于基本清晰了,主要就是硬件不同的问题,和android版本,代码逻辑,jar包都没有太大关系。观察扫描接收器:

	private BroadcastReceiver mScanReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			isScaning = false;
			soundpool.play(soundid, 1, 1, 0, 0, 1);

			byte[] barocode = intent.getByteArrayExtra("barocode");
			byte[] barcode = intent.getByteArrayExtra("barcode");
			int barocodelen = intent.getIntExtra("length", 0);
			byte temp = intent.getByteExtra("barcodeType", (byte) 0);
			barcodeStr = new String(barcode, 0, barocodelen);// 扫描返回数据
			((EditText) findViewById(R.id.txtScan)).setText(barcodeStr);
			// 处理扫描到的数据
			addData(barcodeStr);
		}
	};

这就是很简单的一个接收广播数据字段的receiver,只是目前的扫描都是通过代码来调用扫描头,而新机子是直接配置了按键的,和老机子的操作方式不同,Ok,立马改代码,只要把调用扫描头的代码注释掉,然后广播名称等换成新机子的action名称,在OnCreate()中注册广播。
三下五除二,点击运行,手都是颤抖的,跳转页面,扫描都正常了,终于成功啦!好想哭,花了我大概两周时间哪,像一只无头苍蝇到处乱转!

总结

这是我第一次实战去解决一个android的问题,之前只是看了一点书,没有做过相关的实际意义上的开发。过程中心情焦虑,仿徨,因为不知道最后是否真的可以解决,虽然走了很多弯路,最后总算功夫不负有心人吧,下面是对自己的一个总结:
1.遇到问题一定要有自己的主线的判断;
2.当在同一个问题上花了太多时间时,可以去质疑一切,并且大胆去执行,做任何的努力都比自己闭门造车强,特别是要和外界尽量建立多的连接,才能有新的收获;
3.能发现关键问题的人真的很牛逼,希望自己在慢慢积累过程中也能成为一个融会贯通的人。

猜你喜欢

转载自blog.csdn.net/weixin_35786895/article/details/106814546
今日推荐