Thread内部处理程序的行为是否不同?

时间:2012-03-31 06:59:51

标签: android multithreading handler httphandler

我有这个帖子。早些时候,我在没有线程的情况下测试代码,并且工作正常。获取并处理了值。一旦我把它放在线程中,就不会调用Handler的handleMessage方法。有人可以帮忙吗?

    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 个答案:

答案 0 :(得分:3)

处理程序在创建它们的线程中执行Runnables,在这种情况下是你的线程,所以这没有意义。此外,您在方法范围内创建了Handler,因此只要方法退出就可以对其进行垃圾回收。所以我不确定你是如何向它发送消息的,当它甚至不在可见范围内时。

您需要在线程上创建您希望它处理Runnables(最可能是Main / UI线程)的处理程序,并向您的服务公开对该处理程序的引用。然后,您的服务将Runnables推送到处理程序,它们排队并在主线程上执行。