[英]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
请点击以下链接
Try this: 尝试这个:
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.