I have this thread. Earlier, I was testing the code without the thread and it worked fine. Values were fetched and processed. As soon as I put this in the thread, handleMessage method of Handler is not being called. Can someone please help?
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");
}
}
Handlers execute Runnables in the Thread they are created on, which in this case is your thread, so that doesn’t make sense. Also, you created your Handler within the scope of a method, so it can be garbage collected as soon as the method exits. So I’m not sure how you’re sending a message to it, when it’s not even in visible scope.
You need to create the handler on the Thread you want it to process the Runnables on (most likely the Main/UI thread) and expose a reference to that handler to your Service. Your service then pushes Runnables to the handler and they are queued up and executed on the main Thread.