0:37:17.386/E: Wrapped java.lang.IllegalStateException: image has been recycled
(file:///android_asset/modules/__images__.js#366)
Wrapped java.lang.IllegalStateException: image has been recycled
at file:///android_asset/modules/__images__.js:366:0
第一次:在运行错误代码前加 img=capturescreen(),依旧报错。
第二次:发现出现问题的地方,和前面截图的语句中间都有函数内部调用过过capturescreen()。在函数后加img=capturescreen(),问题暂时解决。
第三次:遇到调用capturescreen()时,图片内容不断变化。需要使用前面的截图。再次分析截图被回收的原因,发现调用函数将截图结果赋值给了函数内部变量img, 将截图传给全局变量img,问题解决。
总结如下:
capturescreen()截图变量的生存周期为此次截图到下一次截图发生。由于生存周期的原因,应该使用全局变量,不使用局部变量。
需要的图片变量如果需要保存,可以images.copy())一份。
function ifClick(color, x1, x2, y, pyl) {
var left;
while (true) {
img = captureScreen();
left = images.findColorEquals(img, color_yd, 0,y-10 , w, h_);;
toastLog("当前坐标"+left);
if ((left.x<(gd_dw[0]-80))){
if (方向([left.x,left.y])=="向右"){
// img1 = captureScreen();
if ((images.detectsColor(img, color, x1, y) && images.detectsColor(img, color, x1 + pyl, y) && images.detectsColor(img, color, x2 - pyl, y) && (!images.detectsColor(img, color, x2, y)))) {
toastLog("点击");
click(990, 1250);
return true;
}
}
}
if ((left.x>(gd_dw[1]+80))){
if (方向([left.x,left.y])=="向左"){
// img1 = captureScreen();
if ((!images.detectsColor(img, color, x1, y)) && images.detectsColor(img, color, x1 + pyl, y) && images.detectsColor(img1, color, x2 - pyl, y) && (images.detectsColor(img, color, x2, y))) {
toastLog("点击");
click(990, 1250);
return true;
}
}
}
function 方向(x0) {
var img;//引发错误的地方
img = captureScreen();
rePoint = images.findColorEquals(img, color_yd, 0,gd_dw[2]-10 , w, h_);
if (rePoint != null) {
if (rePoint.x > x0[0]) { return "向右"; } else { return "向左"; }
}else{return "坐标值出错啦";}
}
截图对象在下一次截图发生时自动被销毁,不需要回收。并不会因为将截图赋值给另一个图片对象而可以继续存在。
比如这段代码:
var img,img1;
images.requestScreenCapture();
img=images.captureScreen();
images.save(img,"/sdcard/img.png","png");
var img2=images.copy(img);
toastLog("img"+typeof(img));
app.viewFile("/sdcard/img.png");
img1=images.captureScreen();
toastLog("img"+typeof(img));
images.save(img2,"/sdcard/img2.png","png");//复制后对象不会自动销毁
img2.recycle();//不再使用需要手动回收
images.save(img,"/sdcard/img.png","png");//此行报错,img已经被自动销毁
报错:
01:57:07.545/E: Wrapped java.lang.IllegalStateException: image has been recycled ([remote]12312312.js#12)
Wrapped java.lang.IllegalStateException: image has been recycled
at [remote]12312312.js:12:0
//在赋值给img1以后,img已经自动销毁,这时存储就会报错。
//所以要继续使用img,必须先一步存储,或者复制。