Android 执行AsyncTask时出现内存不足错误

Android 执行AsyncTask时出现内存不足错误,android,performance,android-asynctask,Android,Performance,Android Asynctask,我正在尝试运行一个现有的android项目。它给出了错误跟踪 02-14 22:49:14.812: E/AndroidRuntime(665): FATAL EXCEPTION: AsyncTask #3 02-14 22:49:14.812: E/AndroidRuntime(665): java.lang.RuntimeException: An error occured while executing doInBackground() 02-14 22:49:14.812: E/And

我正在尝试运行一个现有的android项目。它给出了错误跟踪

02-14 22:49:14.812: E/AndroidRuntime(665): FATAL EXCEPTION: AsyncTask #3
02-14 22:49:14.812: E/AndroidRuntime(665): java.lang.RuntimeException: An error occured while executing doInBackground()
02-14 22:49:14.812: E/AndroidRuntime(665):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.lang.Thread.run(Thread.java:856)
02-14 22:49:14.812: E/AndroidRuntime(665): Caused by: java.lang.OutOfMemoryError
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.io.BufferedWriter.<init>(BufferedWriter.java:71)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.io.BufferedWriter.<init>(BufferedWriter.java:54)
02-14 22:49:14.812: E/AndroidRuntime(665):  at com.jakewharton.disklrucache.DiskLruCache.open(DiskLruCache.java:226)
02-14 22:49:14.812: E/AndroidRuntime(665):  at com.hercules.quantum.QuantumActivity$InitThumbnailDiskCacheTask.doInBackground(QuantumActivity.java:5575)
02-14 22:49:14.812: E/AndroidRuntime(665):  at com.hercules.quantum.QuantumActivity$InitThumbnailDiskCacheTask.doInBackground(QuantumActivity.java:1)
02-14 22:49:14.812: E/AndroidRuntime(665):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
02-14 22:49:14.812: E/AndroidRuntime(665):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-14 22:49:14.812: E/AndroidRuntime(665):  ... 4 more
02-14 22:49:14.812:E/AndroidRuntime(665):致命异常:AsyncTask#3
02-14 22:49:14.812:E/AndroidRuntime(665):java.lang.RuntimeException:执行doInBackground()时出错
02-14 22:49:14.812:E/AndroidRuntime(665):在android.os.AsyncTask$3.done(AsyncTask.java:278)
02-14 22:49:14.812:E/AndroidRuntime(665):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-14 22:49:14.812:E/AndroidRuntime(665):位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-14 22:49:14.812:E/AndroidRuntime(665):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-14 22:49:14.812:E/AndroidRuntime(665):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-14 22:49:14.812:E/AndroidRuntime(665):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-14 22:49:14.812:E/AndroidRuntime(665):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-14 22:49:14.812:E/AndroidRuntime(665):在java.lang.Thread.run(Thread.java:856)处
02-14 22:49:14.812:E/AndroidRuntime(665):由以下原因引起:java.lang.OutOfMemoryError
02-14 22:49:14.812:E/AndroidRuntime(665):在java.io.BufferedWriter.(BufferedWriter.java:71)
02-14 22:49:14.812:E/AndroidRuntime(665):在java.io.BufferedWriter(BufferedWriter.java:54)
02-14 22:49:14.812:E/AndroidRuntime(665):位于com.jakewharton.disklrucache.disklrucache.open(disklrucache.java:226)
02-14 22:49:14.812:E/AndroidRuntime(665):在com.hercules.quantum.QuantumActivity$InitThumbnailDiskCacheTask.doInBackground(QuantumActivity.java:5575)
02-14 22:49:14.812:E/AndroidRuntime(665):在com.hercules.quantum.QuantumActivity$InitThumbnailDiskCacheTask.doInBackground(QuantumActivity.java:1)
02-14 22:49:14.812:E/AndroidRuntime(665):在android.os.AsyncTask$2.call(AsyncTask.java:264)
02-14 22:49:14.812:E/AndroidRuntime(665):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-14 22:49:14.812:E/AndroidRuntime(665):。。。4更多
以及显示此错误的相关源代码

class InitThumbnailDiskCacheTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            synchronized (thumbnailLruCacheLock) {
                // Check if media is mounted or storage is built-in, if so, try and use external cache dir
                // otherwise use internal cache dir
                final String cachePath =
                        Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                                !Environment.isExternalStorageRemovable() ? getExternalCacheDir().getPath() :
                                        getCacheDir().getPath();
                                Log.i("Cache Path","Cache Path"+cachePath);

                try {
                    if (!isCancelled()) {
                        thumbnailLruCache = DiskLruCache.open(
                                new File(cachePath + File.separator + "thumbnails"),
                                APP_VERSION,
                                VALUE_COUNT,
                                DISK_CACHE_SIZE);
                    }
                } catch (IOException e) {
                    Log.e(TAG, "Failed to initialize thumbnail cahce", e);
                }
                thumbnailLruCacheStarting = false; // Finished initialization
                thumbnailLruCacheLock.notifyAll(); // Wake any waiting threads
            }
            return null;
        }
    }
类InitThumbnailDiskCacheTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
已同步(thumbnailLruCacheLock){
//检查介质是否已装入或存储是否内置,如果是,请尝试使用外部缓存目录
//否则,请使用内部缓存目录
最终字符串缓存路径=
Environment.MEDIA\u MOUNTED.equals(Environment.getExternalStorageState())||
!Environment.isExternalStorageRemovable()?getExternalCacheDir().getPath():
getCacheDir().getPath();
Log.i(“缓存路径”、“缓存路径”+缓存路径);
试一试{
如果(!isCancelled()){
thumbnailLruCache=DiskLruCache.open(
新文件(cachePath+File.separator+“缩略图”),
APP_版本,
价值计量,
磁盘(缓存大小);
}
}捕获(IOE异常){
Log.e(标记“未能初始化缩略图cahce”,e);
}
ThumbNAILRUCACHESTARTING=false;//已完成初始化
thumbnailrucachelock.notifyAll();//唤醒所有等待的线程
}
返回null;
}
}

谁能告诉我如何解决这个问题。

您分配的内存太多了。在Android中,进程的内存是有限的(请参阅),进程内存的总量不能超过这个值,否则您将得到一个
OutOfMemoryError
。考虑在几个步骤中拆分您的加载,以便GC可以释放未使用的内存。< /P>哪一个是您的DelkRuCuj.java文件的第二百二十六行?这是Log.i中的librarymain问题(“缓存路径”、“缓存路径”+缓存路径);此日志未显示在LogCat中