0

我正在开发一个项目,我们正在创建一个 Android 应用程序,该应用程序请求来自服务器的数据以显示在用户的设备上(不确定我还能提供多少背景信息......如果需要更多信息,我会尽力而为)。我们支持 Gingerbread (2.3) 及更高版本(直到最新的 JellyBean 4.2)。

现在奇怪的是,该应用程序在运行 2.3.x 的手机上运行得非常快速和流畅(这些通常是稍旧的设备,例如 LG Optimus 2X),而如果我们尝试在相对较新的设备上运行该应用程序( Galaxy s3 等)具有 JellyBean 4.1+,应用程序运行速度太慢以至于性能成为可用性问题。这发生在从服务器提取数据并显示它们的屏幕上。

我还通过在模拟器上运行它来确认这种行为。

所以我做了一些研究,因为我们在 LogCat 中只获得了 4.1+ 的以下内容:

06-29 23:11:17.796:I/Choreographer(691):跳过 X 帧!应用程序可能在其主线程上做了太多工作。

所以看起来这个叫做 Choreographer 的东西是为 API lvl 16 添加的,它协调动画、输入和绘图的时间。

我想知道这是否导致了这个问题?似乎不太可能是硬件问题,我们的应用程序没有任何动画,并且我们没有针对 2.3.x 和 4.1+ 的单独实现

谢谢

4

2 回答 2

1

从 Ice Cream Sandwich 开始, 的默认行为AsyncTask已从并行执行器变为序列化执行器。

当您在一批中执行多个网络请求时AsyncTask(如评论中所见),这意味着您的应用程序在启动下一个请求响应之前等待上一个请求响应。

AsyncTask您可以使用以下代码更改执行者:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else {
    myTask.execute();
}

来源:CommonsWare 博客确认的 AsyncTask 线程回归。

于 2013-03-19T09:38:13.933 回答
1

我在 Kindle Fire、Sony Xperia Z 和三星 S4(都使用 android 4.2)上经历过同样的事情。

修复方法是:在 App Manifest 文件中删除“android:supportsRtl="true"”。

希望它能节省您的时间。在得到它之前,我花了 4 个小时进行测试和合并。

于 2014-02-11T13:07:14.387 回答