了java.lang.RuntimeException:而在Android的执行doInBackground()时出错 [英] java.lang.RuntimeException: An error occured while executing doInBackground() in Android

查看:690
本文介绍了了java.lang.RuntimeException:而在Android的执行doInBackground()时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发展的地方用户出售,购买使用过的物品的应用程序。在我的第一个活动,我有我的地方显示缩略图,当用户点击一个图像,然后带他到详细的活动网格视图。我用后退按钮返回主活动页面。它工作正常,但如果我点击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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆