了java.lang.RuntimeException:而在Android的执行doInBackground()时出错 [英] java.lang.RuntimeException: An error occured while executing doInBackground() in Android
问题描述
我发展的地方用户出售,购买使用过的物品的应用程序。在我的第一个活动,我有我的地方显示缩略图,当用户点击一个图像,然后带他到详细的活动网格视图。我用后退按钮返回主活动页面。它工作正常,但如果我点击8-9图像和失控的内存(OOM)崩溃。
CustomVolleyRequest类
公共类CustomVolleyRequest { 私有静态CustomVolleyRequest customVolleyRequest;
私有静态上下文的背景下;
私人请求队列请求队列;
私人ImageLoader的ImageLoader的;
私人CustomVolleyRequest(上下文的背景下){
this.context =背景;
this.requestQueue = getRequestQueue(); ImageLoader的=新ImageLoader的(请求队列,
新ImageLoader.ImageCache(){
私人最终LruCache<弦乐,位图>
缓存=新LruCache<弦乐,位图>(20); @覆盖
公共位图getBitmap(字符串URL){
返回cache.get(URL);
} @覆盖
公共无效putBitmap(字符串URL,位图位图){
cache.put(URL,位图);
}
});
} 同步CustomVolleyRequest的getInstance(上下文的背景下)公共静态{
如果(customVolleyRequest == NULL){
customVolleyRequest =新CustomVolleyRequest(背景);
}
返回customVolleyRequest;
} 公共请求队列getRequestQueue(){
如果(请求队列== NULL){
缓存缓存=新DiskBasedCache(context.getCacheDir(),10 * 1024 * 1024);
网络网络=新BasicNetwork(新HurlStack());
请求队列=新的请求队列(缓存,网络);
requestQueue.start();
}
返回请求队列;
} 公共ImageLoader的getImageLoader(){
返回ImageLoader的;
}}
内存监控,每次点击的增量,它会释放内存,当我回去的主要活动!
堆栈跟踪:
E / AndroidRuntime:致命的异常:AsyncTask的E / AndroidRuntime:
工艺:PID:5700
了java.lang.RuntimeException:执行时出错
doInBackground()E / AndroidRuntime:在
android.os.AsyncTask $ 3.done(AsyncTask.java:300)E / AndroidRuntime:在
java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
E / AndroidRuntime:在
java.util.concurrent.FutureTask.setException(FutureTask.java:222)
E / AndroidRuntime:在
java.util.concurrent.FutureTask.run(FutureTask.java:242)
E / AndroidRuntime:在
android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)
E / AndroidRuntime:在
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E / AndroidRuntime:在
java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:587)
E / AndroidRuntime:在java.lang.Thread.run(Thread.java:841)
E / AndroidRuntime:因:java.lang.OutOfMemoryError
E / AndroidRuntime:在
android.graphics.BitmapFactory.nativeDe codeStream(本机方法)
E / AndroidRuntime:在
android.graphics.BitmapFactory.de codeStreamInternal(BitmapFactory.java:613)
E / AndroidRuntime:在
android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:589)
E / AndroidRuntime:在
android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:627)
E / AndroidRuntime:在
com.example.xxx.xxx.DownloadImageTask.doInBackground(DownloadImageTask.java:26)
E / AndroidRuntime:在
com.example.xxx.xxx.DownloadImageTask.doInBackground(DownloadImageTask.java:14)
E / AndroidRuntime:在
android.os.AsyncTask $ 2.call(AsyncTask.java:288)
E / AndroidRuntime:在
java.util.concurrent.FutureTask.run(FutureTask.java:237)
E / AndroidRuntime:在
android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)
E / AndroidRuntime:在
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E / AndroidRuntime:在
java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:587)
E / AndroidRuntime:在java.lang.Thread.run(Thread.java:841)
根据日志,看看这个行:
E / AndroidRuntime:因:java.lang.OutOfMemoryError
它清楚地说,应用程序崩溃,只是因为的OutOfMemoryError
例外。一个可能的原因可能是你正在处理大尺寸的位图没有缩减他们。您需要调整和将它们设置为图像视图前降尺度位图。
有关如何有效地管理位图的更多详细信息,请参阅官方文档
I am developing an application where user sells or buys used items. In my first activity, I have grid view where I show thumbnail images and when user clicks on an image and then it takes him to detail activity. I use back button to go back to main activity page. It works fine but crashes if I click on 8-9 images and getting out of memory(OOM).
CustomVolleyRequest Class
public class CustomVolleyRequest {
private static CustomVolleyRequest customVolleyRequest;
private static Context context;
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private CustomVolleyRequest(Context context) {
this.context = context;
this.requestQueue = getRequestQueue();
imageLoader = new ImageLoader(requestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized CustomVolleyRequest getInstance(Context context) {
if (customVolleyRequest == null) {
customVolleyRequest = new CustomVolleyRequest(context);
}
return customVolleyRequest;
}
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
Cache cache = new DiskBasedCache(context.getCacheDir(), 10 * 1024 * 1024);
Network network = new BasicNetwork(new HurlStack());
requestQueue = new RequestQueue(cache, network);
requestQueue.start();
}
return requestQueue;
}
public ImageLoader getImageLoader() {
return imageLoader;
}
}
Memory Monitoring, each click increments, it does free the memory when I go back to main activity!
Stack Trace:
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask E/AndroidRuntime:
Process: PID: 5700
java.lang.RuntimeException: An error occured while executing
doInBackground() E/AndroidRuntime: at
android.os.AsyncTask$3.done(AsyncTask.java:300) E/AndroidRuntime: at
java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
E/AndroidRuntime: at
java.util.concurrent.FutureTask.setException(FutureTask.java:222)
E/AndroidRuntime: at
java.util.concurrent.FutureTask.run(FutureTask.java:242)
E/AndroidRuntime: at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
E/AndroidRuntime: at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime: at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime: at java.lang.Thread.run(Thread.java:841)
E/AndroidRuntime: Caused by: java.lang.OutOfMemoryError
E/AndroidRuntime: at
android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
E/AndroidRuntime: at
android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:613)
E/AndroidRuntime: at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:589)
E/AndroidRuntime: at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:627)
E/AndroidRuntime: at
com.example.xxx.xxx.DownloadImageTask.doInBackground(DownloadImageTask.java:26)
E/AndroidRuntime: at
com.example.xxx.xxx.DownloadImageTask.doInBackground(DownloadImageTask.java:14)
E/AndroidRuntime: at
android.os.AsyncTask$2.call(AsyncTask.java:288)
E/AndroidRuntime: at
java.util.concurrent.FutureTask.run(FutureTask.java:237)
E/AndroidRuntime: at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
E/AndroidRuntime: at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime: at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime: at java.lang.Thread.run(Thread.java:841)
As per the logs, look at this line:
E/AndroidRuntime: Caused by: java.lang.OutOfMemoryError
It clearly says that app is crashing just because of OutOfMemoryError
exception. One possible reason might be you are handling large size bitmaps without downscaling them. You need to resize and downscale your bitmap before setting them to image views.
For more details on how to manage bitmap effectively, see official docs
这篇关于了java.lang.RuntimeException:而在Android的执行doInBackground()时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!