0

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

1.) 我可以为每个位图执行我的 aSync 任务吗?(此语句: new 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();
}
}
4

2 回答 2

2

等等,你在调用 bitmapLoaderThread.run()?很难弄清楚发生了什么,因为这些是没有上下文的代码片段(什么线程在运行?什么函数?),但你不调用 run() - 那是操作系统的工作!要启动一个新线程,您调用 start() - 这将创建新线程并调用它的 run() 函数。如果你直接调用run,你仍然是在你自己的线程中调用它!

除此之外 - 你如何在两个线程之间进行握手?工作线程如何告诉主线程位图已加载?您可以为此使用 Handler,或者您可以完全使用 AsyncTask 而不是 Thread。

于 2010-08-04T03:50:56.197 回答
2

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

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

  2. 这是。通常,我将工作线程设置为比主线程低一级。

于 2010-08-04T05:56:21.590 回答