Issue title: Call drawImage() in loop with only one GImage instance
 Issue body: Hello,

First of all, thanks for maintaining the lib!

What I'm trying to do is to ```drawImage()``` many times as new small chunk of base64 encoded images keep coming in. It was working fine but I noticed memory leak as ```new GImage()``` is called in each loop, and these images are not attached to the DOM so removing ```<GCanvas>``` will not trigger GC.

I decided to try to reuse ```<GImage>``` and refactored to something like this:

```
let gimg = new GImage(); // create only once

async draw(imgbase64) {
  gimg.src = 'data:image/png;base64,' + imgbase64;
  let res = await this.redraw();
  return res;
}

async redraw() {
  return new Promise((resolve, reject) => {
    gimg.onload = () => {
      this.ctx.clearRect(0, 0, canvasWidth, canvasHeight);
      this.ctx.drawImage(gimg, 0, 0, canvasWidth, canvasHeight);
      // 'gimg._src' changes correctly here
      // log: gcanvasCore: GCanvasWeex38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5rawImage texture 1 (which is 'gimg._id') is NULL
      let gimgData = this.ctx.getImageData(0, 0, canvasWidth, canvasHeight);
      resolve(gimgData);
    };
    gimg.onerror = (err) => {
      reject(err);
    };
  });
}

async loop() {
  let img = await getImgbase64();
  let imgData = await this.draw(img); // failed to get new imgData
}
```

Now I get ```gcanvasCore: GCanvasWeex38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5rawImage texture 1 (which is 'gimg._id') is NULL```.
Am a missing something or are there other better ways to prevent memory leak?

Thanks!
 Comments: 
 Comment 0: I think you can resuse `<GImage>` to avoid memory leak.

But there is a bug in your code: `gimg.src =` will trigger `onload` or `onerror` event, so `gimg.onload =` should run before `gimg.src =`

You can try below and tell me the result:
```
let gimg = new GImage(); // create only once

draw(imgbase64) {
  return new Promise((resolve, reject) => {
    gimg.onload = () => {
      this.ctx.clearRect(0, 0, canvasWidth, canvasHeight);
      this.ctx.drawImage(gimg, 0, 0, canvasWidth, canvasHeight);

      let gimgData = this.ctx.getImageData(0, 0, canvasWidth, canvasHeight);
      resolve(gimgData);
    };
    gimg.onerror = (err) => {
      reject(err);
    };

    gimg.src = 'data:image/png;base64,' + imgbase64;
  });
}

async loop() {
  let img = await getImgbase64();
  let imgData = await this.draw(img); // failed to get new imgData
}
```
 Comment 1: Yes you are right, ```src``` should be set after ```onload```, to something like this:

```
let gimg = new GImage(); // create only once

draw(imgbase64) {
  return new Promise((resolve, reject) => {
    gimg.onload = () => {
      this.ctx.clearRect(0, 0, canvasWidth, canvasHeight);
      this.ctx.drawImage(gimg, 0, 0, canvasWidth, canvasHeight);
    };
    gimg.onerror = (err) => {
      reject(err);
    };
    gimg.src = 'data:image/png;base64,' + img;
    let res = this.ctx.getImageData(0, 0, canvasWidth, canvasHeight);
    resolve(res);
  });
}

async loop() {
  let img = await getImgbase64();
  let imgData = await this.draw(img); // only first draw
}
```

This removed ```gcanvasCore: GCanvasWeex38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5rawImage texture 1 is NULL```, but it draws only once with the first call(which is my initial issue anyway...). All following ```draw()``` with new ```imgbase64``` doesn't draw anything new on canvas unless I create ```new GImage()``` in each loop. 

Thanks for taking time to look into this... on the weekend! :-)
 Comment 2: I will take several weekends to refactor the lib to reuse `<GImage>` -- only on weekend I have enought time to maintain the lib 😝 
 Comment 3: Could you tell me the resource of `getImgbase64()`? Comes from a video or fetch from a server?
 Comment 4: Hi!
I have the same problem. i create "img"  out side draw() then set "img.src" inside. call draw() every frame received. On android it works fine but on ios the onload event is fired but only the first frame is drawn.
i had try with:
"@flyskywhy/react-native-gcanvas": "^2.3.21"
"@flyskywhy/react-native-gcanvas": "^2.3.7"
test on iphone xs max os 14.2, iphone 7 plus os 14.6
 Comment 5: > Hi! I have the same problem. i create "img" out side draw() then set "img.src" inside. call draw() every frame received. On android it works fine but on ios the onload event is fired but only the first frame is drawn. i had try with: "@flyskywhy/react-native-gcanvas": "^2.3.21" "@flyskywhy/react-native-gcanvas": "^2.3.7" test on iphone xs max os 14.2, iphone 7 plus os 14.6

Please show me the `img.src = ` code.
 Comment 6: > 
`let imageHttp = new GImage();
  imageHttp.crossOrigin = false; 
  imageHttp.onload = () => {
        ctx.drawImage(imageHttp, 0, 0, imageHttp.width, imageHttp.height, 0, 0, 320, 240);
    };
  imageHttp.onerror = (error: any) => {
        console.log(error);
  };`
and this is draw():
`const draw = async (database64:string) => {
       imageHttp.src = database64;
 };`
 Comment 7: @cwashington@example.net support it.

PS: @unmec , as you can see in README.md

      // for (let i = 0; i < 10; i++) {
      //   await sleepMs(1000);
      //   if (i % 2) {
      //     imageHttp.src =
      //       'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAADklEQVR4AWP4nwZCUAoAKxYFld+CjjoAAAAASUVORK5CYII=';
      //   } else {
      //     imageHttp.src =
      //       'https://gw.alicdn.com/tfs/TB1KwRTlh6I8KJjy0FgXXXXzVXa-225-75.png';
      //   }
      // }

you may directly fetch images then `imageHttp.src =` , without convert to `data:image`
 Comment 8: Cool! I'll update packages and try it out, thanks for the great news!
{'source': 'GithubIssues', 'repo_name_with_owner': 'flyskywhy/react-native-gcanvas', 'issue_id': 1227378979, 'repo_stars': 119.0}