Отличается ли поведение обработчика внутри Thread? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть эта тема.Ранее я тестировал код без потока, и он работал нормально.Значения были получены и обработаны.Как только я помещаю это в поток, метод handleMessage из Handler не вызываетсяМожет кто-нибудь помочь, пожалуйста?

    public class ServiceQuery implements Runnable
    {
        public void run()
        {
            Looper.myLooper().prepare();
            while(true)
            {
                Log.d("D","Starting");
                fetch();
                try
                {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
        private synchronized void fetch()
        {
                Log.d("D","In fetch()");
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("sessionid", Server.getInstance().getSessionID()));
                nameValuePairs.add(new BasicNameValuePair("session", App.getInstance().getSelectedDoodle().getId()));
                nameValuePairs.add(new BasicNameValuePair("passcode", App.getInstance().getSelectedDoodle().getPassword()));
                nameValuePairs.add(new BasicNameValuePair("last-message-id", App.getInstance().lastDrawingID));

                Handler handler = new Handler()
                {
                    public void handleMessage(Message message)
                    {
                        Log.d("D","got response");
                        switch(message.what)
                        {
                            case HttpConnection.DID_SUCCEED:
                                Log.d("D","success" + message.obj.toString());
                        }
                    }
                }
                Server.getInstance().SendHTTPRequest("get-messages", nameValuePairs, handler);
                Log.d("D","HTTP away");

        }
    }

1 Ответ

3 голосов
/ 31 марта 2012

Обработчики выполняют Runnables в потоке, в котором они созданы, в данном случае это ваш поток, так что это не имеет смысла. Кроме того, вы создали свой обработчик в области действия метода, так что он может быть удален после завершения метода. Поэтому я не уверен, как вы отправляете ему сообщение, когда оно даже не в видимой области видимости.

Вам необходимо создать обработчик в потоке, в котором вы хотите, чтобы он обрабатывал Runnables (скорее всего, поток Main / UI), и предоставить ссылку на этот обработчик для вашей службы. Затем ваш сервис передает Runnables в обработчик, и они помещаются в очередь и выполняются в главном потоке.

...