android多线程程序很慢

时间:2014-02-22 14:16:33

标签: android multithreading animation encryption

我创建了一个新线程,其中我做了大约15秒的大量工作,同时屏幕中央有一个旋转箭头。

问题是,旋转动画不流畅。

我使用traceview运行性能测试并获得以下图表: performaceGraph

在上图中,第一行是主UI线程,第二行是我自己的线程,从开始4秒开始就可以看到,我自己的线程工作负载非常少,主线程可以采取几乎所有的CPU时间都做动画渲染,所以动画很好。

但是在接下来的1.5s中,我的线程工作量越来越大,主线程中有一些白色块表示动画暂停了一段时间,因为CPU被从主线程转移到我的线程做了繁重的工作。这就是动画不顺畅的原因。

我追踪了部分,发现BouncyCastleProvider.init完成了大部分工作,相应的代码如下:

SecretKey k = new SecretKeySpec(key.getBytes(), "AES");
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, k);
finalStr = new String(Base64.encode(cipher.doFinal(originalStr.getBytes())));

但是我没有找到其他方法在不使用BouncyCastleProvider的情况下进行AES256Encrypt,我不知道是否有其他方法可以获得流畅的动画,所以我希望我能从你那里得到一些想法来优化程序,谢谢!

2 个答案:

答案 0 :(得分:1)

这可能不是你的工作线程所采用的CPU,但我敢打赌它会产生大量内存,而Java垃圾收集导致你的动画线程口吃。 Dalvik可以进行并发GC,但是有一些短暂的时间段它会暂停所有线程,而某些GC不是并发的。查看您的ADB logcat输出并查找GC消息。我不知道BouncyCastleProvider的详细信息,所以我不知道在分配对象方面有多脏,但可能没有太多可以做的。

要注意的是要非常努力地避免动画线程中的任何类型的Java分配。这将减少堆积用于处理GC的死对象的数量,并且将减少一些非动画线程GC将使您的动画口吃的机会。 DDMS中的内存工具可以帮助您查找正在分配的对象;其中许多并不明显。

作为旁注,您可以查看设置线程优先级,以便为您的工作线程提供较低的优先级,并确保它不会使动画线程匮乏,但这对GC停顿没有帮助 - 这些会阻止世界。所以它可能对你的问题没有任何帮助。

答案 1 :(得分:1)

尝试将BC init内容放入服务中,然后使用清单将该服务放入a separate process

这是一个疯狂的猜测,但是分成2个进程,通常在应用程序中永远不会发生,可能会解决一些资源争用(cpu,内存)。