【发布时间】:2016-06-02 04:06:08
【问题描述】:
我正在使用 AsyncTask 从 Internet 下载图像。我在 ViewPager 中显示它们。
我使用 MyPagerAdapter 中的 instantiateItem 方法调用它:
downloader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,imageView, url);
我的下载器看起来像:
protected Bitmap doInBackground(Object... params) {
//(...)
//downloading image using httpConnection and decoding it to bitmap using BitmapFactory
//(...)
Log.d("myApp", "returning");
start = System.currentTimeMillis();
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
long stop = System.currentTimeMillis();
long period = stop-start;
Log.d("myApp-trace","it took: "+period);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
}
}
问题是,从 doInBackground 返回和进入 onPostExecute 之间大约需要 2000 毫秒。
奇怪的是,当我稍后(在加载第一张图像后)滑动 ViewPager 时,它可以正常工作并且需要大约 0-5 毫秒。
你有什么想法可能是由什么引起的吗?
【问题讨论】:
-
这些图片有多大?他们被缓存了吗?你是从 viewpager 调用执行吗?
-
我不知道为什么图像大小或缓存它们很重要。下载它们不是问题并且运行速度很快(它们大约为 200kB jpg,它们没有被缓存)。我只是在下载图像进入 onPostExecute 后很长时间有问题(它只在开始时发生)。正如我所说,我从 MyPagerAdapter 中的 instantiateItem 方法调用执行。
-
这是因为您在其他地方阻塞了主线程。执行调用后 instanceiteItem 中的 Fx... 主线程上的调用已排队,因此 onPostExecute 必须等待轮到它...
-
不知道什么时候可以屏蔽。调用 execute 是在 instantiateItem 中完成的最后一件事。设置适配器是活动中 onCreateView 中的最后一件事据我所知,在 UI 线程上应该什么都不做。我怎样才能检查发生了什么?我尝试过使用 DDMS 方法分析,但我只从 Android SDK 获取方法,这对我没有任何意义。
标签: android performance android-asynctask android-viewpager android-pageradapter