简体   繁体   English

doInBackground和ListFragment中的错误

[英]error in doInBackground and ListFragment

I have an adapter, ListView and data. 我有一个适配器,ListView和数据。 I load data from a website showing on the screen. 我从屏幕上显示的网站加载数据。 Scrolls and when I reach the end of the new data is loaded. 滚动并在到达新数据末尾时加载新数据。 everything works well. 一切正常。 But when I scroll up trying to load image error output. 但是当我向上滚动尝试加载图像错误输出时。 and always differently. 而且总是不同的。

protected String doInBackground(String... arg) {
    if (arg[1].equals("video")) {
                requestCode = 2;
                Document doc;
                try {
                    String text = "total: "+Runtime.getRuntime().totalMemory()+"\n"+
                            "freeMemory: "+Runtime.getRuntime().freeMemory()+"\n"+
                            "max: "+Runtime.getRuntime().maxMemory();

                    Log.d("=========", text);
                    linkVideo = null;
                    doc = Jsoup.connect(arg[0]).get();
                    title = doc.select("a[href]");
                    for (Element titles : title) {
                        if (titles.outerHtml().contains("Скачать (Загрузок:")) {
                            linkImage=titles.attr("abs:href");
                            Picasso p = Picasso.with(MyActivity.context);
                            linkVideo = p.load(linkImage).get();
                            Log.d("HZ",linkVideo.toString());
                            break;
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
}
        return null;

error log 错误日志

04-03 14:38:33.395: ERROR/AndroidRuntime(30812): FATAL EXCEPTION: AsyncTask #3
        java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:278)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:856)
        Caused by: java.lang.OutOfMemoryError
        at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
        at com.squareup.picasso.NetworkBitmapHunter.decodeStream(NetworkBitmapHunter.java:108)
        at com.squareup.picasso.NetworkBitmapHunter.decode(NetworkBitmapHunter.java:60)
        at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:123)
        at com.squareup.picasso.RequestCreator.get(RequestCreator.java:225)
        at com.example.GoogleMemu.NewThread.doInBackground(NewThread.java:75)
        at com.example.GoogleMemu.NewThread.doInBackground(NewThread.java:23)
        at android.os.AsyncTask$2.call(AsyncTask.java:264)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

and

  @Override
    public void onBackPressed() {
        super.onBackPressed();
        b = null;
        iv.setImageBitmap(null);
        try {
            iv.destroyDrawingCache();
        }catch (Exception ex){ex.printStackTrace();}

        iv=null;
        try {
            finish();
        }catch (Exception ex){ex.printStackTrace();}

    }

Try to create scaled bitmap using following line of the code: 尝试使用以下代码行创建缩放的位图:

Bitmap scaledBitmap = Bitmap.createScaledBitmap(myBitmap, width,
                height, true);

I have already given the answer for this question. 我已经给出了这个问题的答案。 Please follow the below link 请点击以下链接

Exception : OutOfMemoryError 异常:OutOfMemoryError

Try this: 尝试这个:

Note: IMAGE_MAX_SIZE set the size of this variable according to your density. 注意: IMAGE_MAX_SIZE根据您的密度设置此变量的大小。 By passing it in the metod 通过它的方法

final int IMAGE_MAX_SIZE;
if(dens.equalsIgnoreCase(density)){
        IMAGE_MAX_SIZE = 25000;//0.2 MP == 200000
}else if(dens.equalsIgnoreCase(density)){
    IMAGE_MAX_SIZE = 40000;
}else if(dens.equalsIgnoreCase(density)){
    IMAGE_MAX_SIZE = 70000;
}else{
    IMAGE_MAX_SIZE = 60000;
}

URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
connection.addRequestProperty(BConstant.WEB_SERVICES_COOKIES,
                cookie);
connection.addRequestProperty(
                BConstant.WEB_SERVICES_TOKEN_HEADER, token);
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
int height = myBitmap.getHeight();
int width = myBitmap.getWidth();
double y = Math.sqrt(IMAGE_MAX_SIZE / (((double) width) / height));
double x = (y / height) * width;
Bitmap scaledBitmap = Bitmap.createScaledBitmap(myBitmap, (int) x,
                (int) y, true);
myBitmap.recycle();
    myBitmap = scaledBitmap;
System.gc();
return myBitmap;

The answer is quite simple: you are loading an image - and it's too large resulting in OutOfMemoryError , thus crashing your app. 答案很简单:您正在加载图像-图像太大会导致OutOfMemoryError ,从而使您的应用程序崩溃。 Considering that you're dealing with the list, you don't need to load full-size images. 考虑到您正在处理列表,因此不需要加载完整尺寸的图像。 Consider loading/decoding scaled down images instead. 考虑改为加载/解码按比例缩小的图像。

Have a look at this Android tutorial page - specifically, section "Loading scaled down version into memory". 看看这个Android教程页面 -特别是“将缩小版本加载到内存中”部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM