我一直在尝试优化我的单线程应用程序,它会加载一堆构成大位图的图块。当它将新的磁贴加载到系统内存中时,应用程序变得非常迟缓。我现在正在尝试使用异步任务来实现此目的。应用程序检测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();
}
}
答案 0 :(得分:2)
等等,你正在调用bitmapLoaderThread.run()?很难弄清楚发生了什么,因为这些是没有上下文的代码片段(什么线程正在运行?什么功能?),但是你不调用run() - 这就是操作系统的工作!要启动一个新线程,请调用start() - 这将创建新线程并调用其run()函数。如果直接调用run,你仍然在自己的线程中调用它!
除此之外 - 你如何在两个线程之间进行握手?工作线程如何告诉主线程加载位图?您可以使用Handler,或者您可以使用AsyncTask而不是Thread。
答案 1 :(得分:2)
为您的全新问题添加新答案:)
取决于位图的数量。你有多少?你不想创建几十个线程。毕竟,你的硬件上只有一个核心,所以拥有多个线程不会给你带来任何东西 - 上下文切换只会淹没它。如果你有大量的位图,你可能想要一个位图队列并完成它。为此,Thread和Handler实际上会更好。
是的。通常,我将工作线程设置为比主线程低一个优先级。