Есть ли способ проверить, используется ли объект Message? - PullRequest
3 голосов
/ 28 декабря 2011

Случайные числа генерируются с использованием кода ниже Несмотря на вызов message.recycle ();Возникает исключение AndroidRuntimeException с описанием - «Это сообщение уже используется» при вызове sendMessage (...)

Существует ли способ проверить, находится ли сообщение виспользовать?Что я здесь не так делаю?

RandomGenerator implements Runnable{
....
public void run(){
  ... 
    while(true){
        synchronized(randomizer){
            temp = randomizer.nextFloat() * scaleFactor;
        }

        Bundle bundleodata = new Bundle();
        bundleodata.putFloat( null, temp );

        synchronized(handler){
            Message messedUp = Message.obtain(handler);
            messedUp.setData(bundleodata);
            handler.sendMessage(messedUp);
        }
        Thread.yield();
    }
}
....
}

Тело обработчика переопределяет handleMessage следующим образом

public void handleMessage( Message message ){
    String strStuff = Float.valueOf( message.getData(null).getFloat() ).toString();
    textVw.setText(strStuff);
    message.recycle();
}

РЕДАКТИРОВАТЬ: Итак, после того как я удалил 'message.recycle ();'исключение больше не выбрасывается.Однако мне все еще любопытно, почему исключение больше не выдается теперь, когда удален вызов для переработки объекта.Идеи, кто-нибудь?

РЕДАКТИРОВАТЬ: замена вызова

msg.recycle();

на

removeMessages(0);

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

msg.recycle();

привел к исключению, о котором я первоначально сообщил .

1 Ответ

2 голосов
/ 28 июня 2012

Это интересный вопрос.Я столкнулся с той же проблемой точно в том же контексте, то есть внутри ситуации «handleMessage (Message message)».Я полагаю, что это потому, что сообщение, которое вы пытаетесь переработать («message»), является неотъемлемой частью объявленного метода handleMessage (Message message) и всегда будет использоваться этим методом.«message» - это не локальная переменная, которой вы управляете, а переменная, всегда используемая методом handleMessage () ...

Также см .: https://groups.google.com/forum/?fromgroups#!topic/android-developers/9pHuc7lGunY для обсуждения того, почему это лучшене вызывать message.recycle ().

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