使用aSyncTask优化位图加载

时间:2010-08-04 01:20:25

标签: android multithreading bitmap android-asynctask runnable

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

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

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

3。)有更好的方法可以解决这个问题吗?我确定它是位图加载,而不是画布图减慢了应用程序。

我的临时aSync代码:

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();
}
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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