我一直在尝试优化我的单线程应用程序,该应用程序加载一堆组成大位图的图块。当应用程序将新图块加载到系统内存中时,它变得非常缓慢。我现在正在尝试使用异步任务来实现此目的。该应用程序在 onDraw 调用的方法中检测哪个图块位于左上角,创建一个包含 Assets 文件夹中位图路径的字符串,然后在绘制之前检查位图是否为空。如果为空,则将其加载到内存中。我的想法是在 DoBackground 中处理位图,并在 postExecute 中触发视图无效以显示异步加载的位图。几个问题:

1.) 我可以为每个位图执行 aSync 任务吗?(这个说法:新的 myAsyncTaskManager().execute(bitmapPath);如果没有,最好的方法是什么,因为 aSync 唯一要做的就是将位图加载到内存中?

2.) 如果位图加载太慢,是否可以设置优先级aSyncTask?

3.) 有没有更好的方法来解决这个问题?我确定是位图加载,而不是画布绘制减慢了应用程序的速度。

我的临时异步代码:

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();
}
}
有帮助吗?

解决方案

为您的全新问题添加新答案:)

  1. 取决于位图的数量。你有多少?您不想创建数十个线程。毕竟,您的硬件上只有一个核心,因此拥有多个线程不会给您带来任何好处 - 上下文切换只会淹没它。如果您有大量位图,您可能需要一个位图队列并对其进行处理。为此,线程和处理程序实际上会更好。

  2. 这是。一般来说,我将工作线程的优先级设置为比主线程低一级。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top