Android ожидает аннулирования потока пользовательского интерфейса - PullRequest
0 голосов
/ 22 июля 2011

У меня проблемы с перерисовкой вида в приложении для рисования. Когда касание заканчивается, я вызываю touch_up (), чтобы создать путь, invalidate (), чтобы нарисовать его, и storeView (), чтобы поместить текущий вид в стек. Тем не менее, представление не перерисовывается вообще (до следующего касания, что дает ему раздражительный эффект). Если я удаляю вызов storeView (), он сразу перерисовывается.

Я понимаю из здесь , что проблема недействительна () не обязательно возникает немедленно, и я думаю, что мне нужно создать новый поток или обработчик, чтобы ждать ее. Несмотря на то, что я читаю страницы разработчиков, я не совсем понимаю, как это реализовать.

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

Вот что я сейчас делаю.

Action_up:

case MotionEvent.ACTION_UP:
    touch_up();
    invalidate();
    storeView();
    break;

Touch_up:

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

storeView:

public void storeView(){
    historyCount++;
    if(historyCount > historySize) historyCount = 6;    //We don't want more than 6
    history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}

1 Ответ

1 голос
/ 22 июля 2011

Когда касание заканчивается, я вызываю touch_up (), чтобы создать путь, аннулировать (), чтобы нарисовать его, и storeView (), чтобы поместить текущее представление в стек.

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

Отсюда я понимаю, что проблема недействительна () не обязательно происходит немедленно

Correct.

и я думаю, что мне нужно создать новый поток или обработчик, чтобы ждать его.

Нет, если вы собираетесь придерживаться своей реализации сохранения всего растрового изображения, вам необходимо убедиться, что storeView() вызывается после завершения invalidate(). Завершение вызова на storeView() в Runnable и планирование этого Runnable посредством вызова на post() на myView должно быть достаточным.

...