【问题标题】:AsyncTask - long time between returning from doInBackground and execution of onPostExecute (with PagerAdapter)AsyncTask - 从 doInBackground 返回和执行 onPostExecute 之间的很长时间(使用 PagerAdapter)
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多