解决autojs报错:Wrapped java.lang.IllegalStateException: image has been recycled 。

用autojs写了一个截图,判读色块位置并点击的代码,运行出错。报错如下:

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,必须先一步存储,或者复制。

 

 

 

你可能感兴趣的:(autojs)