什么原因会导致Android 4.1.X的加载速度变慢而在4.2上不会?

7

我正在使用UrlImageViewHelper来在适配器视图中加载图片。

我的适配器是:


@Override
public View getView(int position, View convertView, ViewGroup parent) {              
    if(convertView==null){
        convertView=new SquaredImageView(getContext());
    }
    SquaredImageView view= (SquaredImageView) convertView;
    final long time=System.currentTimeMillis();
    UrlImageViewHelper.setUrlDrawable(view,getItem(position).getLook_picture(),
           R.drawable.placeholder_bkp, -1,new UrlImageViewCallback() {
                   @Override
                   public void onLoaded(ImageView imageView, Bitmap loadedBitmap, 
                                              String url, boolean loadedFromCache) {
                       Log.d(TAG,"time : "+ (System.currentTimeMillis()-time));
                   }
    });
    return view;
}

我正在下载和显示大图片(620x620 JPG)在一个全宽度列表中。第一次下载/显示速度很慢,但在HTC One升级到Android 4.2之后,这个问题不再存在。

我试图分析调用过程,我认为在非常长的调用期间,它会挂起读取套接字输入流。

有人知道为什么两个平台之间性能差别如此之大吗?


日志输出: (100毫秒以下的时间通常是重复的)

Android 4.1.2 Galaxy SIII mini:

  • 时间: 3217
  • 时间: 4782
  • 时间: 124
  • 时间: 56
  • 时间: 168
  • 时间: 84
  • 时间: 102
  • 时间: 2819
  • 时间: 2703
  • 时间: 154
  • 时间: 2468
  • 时间: 81
  • 时间: 40
  • 时间: 52
  • 时间: 2495
  • 时间: 37
  • 时间: 2007
  • 时间: 58
  • 时间: 38
  • 时间: 119
  • 时间: 80
  • 时间: 44
  • 时间: 2419
  • 时间: 1651
  • 时间: 40
  • 时间: 2766
  • 时间: 90
  • 时间: 1889
  • 时间: 183
  • 时间: 2515
  • 时间: 58
  • 时间: 3345
  • 时间: 2661
  • 时间: 81
  • 时间: 2434
  • 时间: 119

大多数超过1.5秒,用户需要逐一滚动项目以查看图片

Android 4.3 Nexus 4:

  • 时间: 47
  • 时间: 1111
  • 时间: 154
  • 时间: 46
  • 时间: 124
  • 时间: 115
  • 时间: 150
  • 时间: 201
  • 时间: 332
  • 时间: 366
  • 时间: 450
  • 时间: 82
  • 时间: 167
  • 时间: 81
  • 时间: 150
  • 时间: 224
  • 时间: 224
  • 时间: 143
  • 时间: 185
  • 时间: 66
  • 时间: 183
  • 时间: 66
  • 时间: 218
  • 时间: 98
  • 时间: 169
  • 时间: 49
  • 时间: 148
  • 时间: 65
  • 时间: 64
  • 时间: 60
  • 时间: 169
  • 时间: 51

平均响应时间保持在500毫秒以下,列表可用。


也许在getView方法中分配UrlImageViewCallback会减慢它的速度,你可以尝试一遍又一遍地传递相同的实例吗? - Kirill Kulakov
适配器的getview方法所花费的时间始终低于5毫秒。如果我删除整个回调,我会看到相同的结果(一个非常慢,另一个很快)。我不认为回调是问题的原因。 - alaeri
你确定这不仅仅是下载时间吗?文件有多大?后面的数值表明它们可能是从缓存中加载的。 - koush
嗨koush :) 这些文件大小在70到110 KB之间,并且会被扩展。 - alaeri
1
我怀疑这是平台的一个bug,因为我们在运行Android 4.1.2的三星Galaxy Note 10"和Google Nexus S上都遇到了完全相同的问题。在较新版本的Android中,这个问题不存在,就像原帖作者所说的那样。 - Antti
2个回答

2

这与手机上运行的操作系统无关。可能的原因和最可能的原因是设备上其他应用程序消耗的RAM内存数量。为了测试目的,请尝试在没有多个应用程序运行的新设备上运行相同的代码。


我曾经认为这是事实,直到我们将一个HTC One设备升级到4.2版本后,一切都加快了。除非在HTC One的4.1和4.2之间分配给应用程序的RAM数量增加了。我现在没有这个设备来检查了。 - alaeri
我正在授予你赏金。它有一个赞,这仍然是最可能的原因。不过,我不明白为什么在htc one升级后会发生改变。 - alaeri

1
UrlImageViewHelper使用HttpURLConnection来进行与提供图像的web服务器的http调用。我们使用了HttpURLConnection(并尝试了大多数其他类来执行http get),发现它是最不容易出错的类(特别是在Android 2.3上),而其他类(例如org.apache.http等)则通常很容易出错。有一次,我在我们的web服务器上使用协议分析器(tcpdump或tshark)发现ACK没有及时返回,我认为(这是一年前),我在WiFi和蜂窝数据(T-Mobile GSM)上发现了几乎相同的问题。我得出结论,这些类中存在低级问题,也许是Dalvik本身的问题。再次强调,我不希望这个答案获得赏金,我没有试图证明我的说法,我只是回顾了我在研究类似问题时所做的努力。

搜索 StackOverflow 与 HttpURLConnection 相关的内容。 - tallen
我尝试使用Picasso替换UrlImageViewHelper,但是我得到了相同的结果 :( Picasso使用okhttp库。它可能受到相同低级问题的影响,但不确定。 - alaeri
这个问题可能有相同的问题,但没有人回答:(我已经把奖励给了其他答案,但我想感谢你的帮助。下周我会尝试更新问题并附上测试结果。 - alaeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接