I’m developing a chat application in Android and have run into a massive problem. I need a thread to constantly run in the background (polling a server), and have attached it to my main process via a Handle.
The main problem is: As long as this background thread is running, the foreground one grinds to a complete halt!
Here is an incomplete chunk of code (because the full version is much longer/uglier)…
public class ChatActivity extends Activity {
...
private Thread chatUpdateTask;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
...
chatUpdateTask = new ChatUpdateTask(handler);
chatUpdateTask.start();
}
public void updateChat(JSONObject json) {
// ...
// Updates the chat display
}
// Define the Handler that receives messages from the thread and update the progress
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
// Get json from the sent Message and display it
updateChat(json);
}
};
public class ChatUpdateTask extends Thread {
Handler mHandler; // for handling things outside of the thread.
public ChatUpdateTask(Handler h) {
mHandler = h; // When creating, make sure we request one!
}//myTask
@Override
public void start() {
while(mState==STATE_RUNNING) {
// ...
// Send message to handler here
Thread.sleep(500); // pause on completion
}//wend
}//end start
/* sets the current state for the thread,
* used to stop the thread */
public void setState(int state) {
mState = state;
}//end setState
public JSONObject getChatMessages() {
// ... call server, return messages (could take up to 50 seconds to execute;
// server only returns messages when there are new ones
return json;
}
}//end class myTask
}
You’re overriding
start(). Threads run in theirrun()method.http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html