Android: анимация и многопоточность - PullRequest
0 голосов
/ 08 июня 2011

Я пытаюсь реализовать многопоточность в своем приложении, и я хотел бы знать, как я могу это сделать. В основном в одном представлении у меня есть 2 блока, я хочу, чтобы эти два блока отскакивали по экрану, однако я хочу, чтобы каждый блок работал в своем собственном потоке. Так что один вид многопоточности ... если это возможно. Вот что у меня есть:

public class mainActivity extends Activity {


protected static final int GUIUPDATEIDENTIFIER = 0x101;

//Thread myRefreshThread = null;

BounceView myBounceView = null;

Handler myGUIUpdateHandler = new Handler() {

    @Override
    public void handleMessage(Message msg){
        switch (msg.what){
        case mainActivity.GUIUPDATEIDENTIFIER:
            myBounceView.invalidate();
            break;
        }
        super.handleMessage(msg);
    }
};


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);

    this.myBounceView = new BounceView(this);
    this.setContentView(this.myBounceView);

    new Thread (new RefreshRunner()).start();

}

class RefreshRunner implements Runnable {
    // @Override
    public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                    // Send Message to the Handler which will call the invalidate() method of the BoucneView
                    Message message = new Message();
                    message.what = mainActivity.GUIUPDATEIDENTIFIER;
                    mainActivity.this.myGUIUpdateHandler.sendMessage(message);

                    try {
                            Thread.sleep(100); // a 10th of a second
                    } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                    }
            }
    }
}


}

Мой BounceView:

public class BounceView extends View {


protected Drawable mySprite;
protected Point mySpritePos = new Point(0,0);

protected enum HorizontalDirection {LEFT, RIGHT}
protected enum VerticalDirection {UP, DOWN}
protected HorizontalDirection myXDirection = HorizontalDirection.RIGHT;
protected VerticalDirection myYDirection = VerticalDirection.UP;


public BounceView(Context context) {
        super(context);

        this.mySprite = this.getResources().getDrawable(R.drawable.block);
}

@Override
protected void onDraw(Canvas canvas) {
        /* Check if the Ball started to leave
         * the screen on left or right side */
        if (mySpritePos.x >= this.getWidth() - mySprite.getBounds().width()) {
                this.myXDirection = HorizontalDirection.LEFT;
        } else if (mySpritePos.x <= 0) {
                this.myXDirection = HorizontalDirection.RIGHT;
        }

        /* Check if the Ball started to leave
         * the screen on bottom or upper side */
        if (mySpritePos.y >= this.getHeight() - mySprite.getBounds().height()) {
                this.myYDirection = VerticalDirection.UP;
        } else if (mySpritePos.y <= 0) {
                this.myYDirection = VerticalDirection.DOWN;
        }

        /* Move the ball left or right */
        if (this.myXDirection == HorizontalDirection.RIGHT) {
                this.mySpritePos.x += 10;
        } else {
                this.mySpritePos.x -= 10;
        }
        /* Move the ball up or down */
        if (this.myYDirection == VerticalDirection.DOWN) {
                this.mySpritePos.y += 10;
        } else {
                this.mySpritePos.y -= 10;
        }

        /* Set the location, where the sprite
         * will draw itself to the canvas */
        this.mySprite.setBounds(this.mySpritePos.x, this.mySpritePos.y,
                        this.mySpritePos.x + 50, this.mySpritePos.y + 50);

        /* Make the sprite draw itself to the canvas */
        this.mySprite.draw(canvas);
 }
}

Так что это прекрасно работает, но обрабатывает только один блок. Я хотел бы добавить дополнительный блок (используя тот же рисунок), который обрабатывается отдельным потоком. Как я могу это сделать? мне нужно сделать отдельный вид для другого блока?

1 Ответ

0 голосов
/ 08 июня 2011

Петлитель, который используется для чтения сообщений, которые вы отправляете из вашего потока, является потокобезопасным, но также упорядочивает полученные сообщения, то есть он может обрабатывать только 1 msg в любой момент времени. Хотя теоретически вы могли бы очень просто отправлять сообщения этому обработчику из двух отдельных потоков, я не уверен, что он достигнет желаемого. Я предполагаю, что вы ищете какое-то повышение производительности от использования нескольких потоков?

Если вы пытаетесь получить прирост производительности, против вас действуют две вещи. В приведенном выше коде обновление пользовательского интерфейса выполняется одним потоком. Независимо от того, сколько потоков вы отправляете сообщения в myGUIUpdateHandler, одновременно обрабатывается только одно сообщение. Это может привести к сотням и недействительности, но вся ваша сцена перерисовывается. Во-вторых, у вас может быть только один поток, модифицирующий элементы пользовательского интерфейса Android. Если вы надеетесь, что два потока будут независимо перерисовывать два разных поля с помощью View, это невозможно. На самом деле, я не знаю, возможно ли это сделать, даже используя представления на основе opengl, так как я думаю, что opengl также зависит от концепции петлителя.

Я бы ответил, что это невозможно, если только вы не захотите уточнить, зачем вам нужны два потока, чтобы я мог попытаться сформировать альтернативное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...