使用的AsyncTask优化位图加载(optimizing bitmap loading by us

2019-10-29 21:50发布

我一直在试图优化它加载了一堆砖妆容大位图的我的单线程应用程序。 该应用程序变得非常缓慢时,它会载入新砖到系统内存。 林现在正在尝试使用异步任务用于此目的。 该应用程序检测哪个瓦片是留在一个由所谓的onDraw方法上,创建一个包含在资产文件夹中的位图的路径的字符串,然后检查是否位图绘制之前空。 如果为空,将其加载到内存中。 我的想法是在处理的DoBackground位图,并在postExecute触发视图无效,显示异步加载位图。 几个问题:

1)我可以执行我的任务异步每个位图? (下面的语句:新myAsyncTaskManager()执行(bitmapPath);如果没有,什么是去了解它,因为唯一异步会做的位图只是加载到内存的最好方法?

2)是否有可能设置优先级的AsyncTask如果位图加载速度太慢?

3)是否有更好的方式去这件事吗? IM一定是位图加载,而不是减慢应用画布绘制。

我暂时异步代码:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}

Answer 1:

添加一个新的答案,你完全新的问题:)

  1. 取决于位图的量。 你有多少? 你不希望创建几十个线程。 毕竟,你只需要在你的硬件一个内核,所以有多个线程不会买任何东西 - 上下文切换只会淹没它。 如果你有一大堆的位图,你可能希望有位图的队列,并通过它的工作。 为此,一个线程和处理程序实际上是更好的。

  2. 它是。 一般来说,我的工作线程一个优先级大于主线程低。



Answer 2:

等等,你打电话bitmapLoaderThread.run()? (?什么线程的东西上运行什么功能),这是一种很难搞清楚是怎么回事,因为这些都是没有上下文的代码段,但你不调用运行() - 这是操作系统的工作! 要开始一个新的线程,你调用start() - 这将创造新的线程,并调用它的run()函数。 如果你打电话直接运行,你仍然称其为自己的线程!

除此之外, - 你怎么办两个线程之间的握手? 如何工作者线程告诉主线程,该位被加载? 你可以使用一个处理程序为,或者你可以完全使用的AsyncTask,而不是线程的。



文章来源: optimizing bitmap loading by using aSyncTask