Я создал этот пул, который имеет 5 статических переменных.
public class FruitPool extends GenericPool<Sprite> {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private ITextureRegion texture1;
private ITextureRegion texture2;
private ITextureRegion texture3;
private ITextureRegion texture4;
private ITextureRegion texture5;
private Scene mScene;
private Context mContext;
private Camera mCamera;
private LinkedList<Sprite>pool1;
private static Sprite fruitOne;
private static Sprite fruitTwo;
private static Sprite fruitThree;
private static Sprite fruitFour;
private static Sprite fruitFive;
private Sprite fruit;
// ===========================================================
// Constructors
// ===========================================================
public FruitPool(final ITextureRegion watermelonRegion,
ITextureRegion cherryRegion,ITextureRegion mBallTextureRegion, ITextureRegion grapeTextureRegion, ITextureRegion strawberryTextureRegion,Scene mScene2, Camera camera, LinkedList<Sprite>items) {
this.texture1 = watermelonRegion;
this.texture2 =cherryRegion;
this.texture3 = mBallTextureRegion;
this.texture4 = grapeTextureRegion;
this.texture5 = strawberryTextureRegion;
this.mScene = mScene2;
this.pool1 = items;
this.mCamera = camera;
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
protected Sprite onAllocatePoolItem() {
Random randFruit = new Random();
int textureNumber = randFruit.nextInt(5)+1;
switch(textureNumber){
case 1:
if (fruitOne == null) {
fruitOne = new Sprite(0, 0, this.texture1);
Log.e("FruitPool", "Item rremade");
} else {
fruit = fruitOne;
Log.e("FruitPool", "Item exist in pool..Used");
}
break;
case 2:
if(fruitTwo == null){
fruitTwo = new Sprite(0, 0, this.texture2);
}else{
fruit = fruitTwo;
Log.e("FruitPool", "Item exist in pool..Used");
}
break;
case 3:
if(fruitThree == null){
fruitThree = new Sprite(0, 0, this.texture3);
}else{
fruit = fruitThree;
Log.e("FruitPool", "Item exist in pool..Used");
}
break;
case 4:
if(fruitFour == null){
fruitFour = new Sprite(0, 0, this.texture4);
}else{
fruit = fruitThree;
Log.e("FruitPool", "Item exist in pool..Used");
}
break;
case 5:
if(fruitFive == null){
fruitFive = new Sprite(0, 0, this.texture5);
}else{
fruit = fruitFive;
Log.e("FruitPool", "Item exist in pool..Used");
}
break;
}
return fruit;
}
@Override
protected void onHandleObtainItem(final Sprite pItem) {
pItem.reset();
}
@Override
protected void onHandleRecycleItem(final Sprite pItem) {
pItem.setVisible(false);
pItem.setIgnoreUpdate(true);
}
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}
Как вы видите в моем методе onAllocate, я проверяю, существует ли элемент, если он возвращается, я возвращаю его в методе.
Так что в своей основной деятельности я использую
face = fruitsPool.onAllocatePoolItem();
Это работает изначально, но проблема в том, что я прикрепляю лицо к сцене примерно каждую секунду. И я получаю ошибку, что спрайт уже был прикрепленна сцену.Сначала я нашел единственный способ сделать это - создать новый Sprite каждую секунду и отсоединить его, когда я закончу с ним, но это использует слишком много памяти и приводит к задержке, когда зависает.
Кто-нибудьесть какие-либо указатели на то, что мне нужно сделать, или предложения для меня код?