1

我使用AsyncTask从Internet下载图像。我在ViewPager中显示它们。AsyncTask - 从doInBackground返回并执行onPostExecute(使用PagerAdapter)很长时间

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 returing和进入onPostExecute约〜2000毫秒

我使用MyPagerAdapter调用它从instantiateItem方法。

奇怪的是,当我稍后滑动ViewPager时(在加载第一个图像后),它正常工作并需要约0-5毫秒。

你有什么想法可以造成什么?

+0

这些图像有多大?他们被缓存?你是从viewpager调用执行吗? –

+0

我不知道为什么图像的大小或缓存它们很重要。下载它们不是问题,并且工作速度很快(它们大约是200kB jpgs,它们没有被缓存)。我只是在图像下载后输入onPostExecute很长一段时间的问题(它只发生在开始)。 正如我所说,我从MyPagerAdapter中的instantiateItem方法调用execute。 – michalsol

+0

因为你在其他地方阻塞主线程。执行调用后的instantiateItem中的Fx ...主线程上的调用已排队,因此onPostExecute必须等待轮到它... – Selvin

回答

0

好的,我找到了一个解决方案。问题出在碎片 - 当我用ViewPager开始新的活动时,花了很多时间来保存旧碎片的捆绑包(有许多对象的列表为Serializable)。我注意到通过查看DDMS方法分析。没有我自己的方法,所以我认为它可能是片段操作的东西。

相关问题