In main activity, implement a custom Handler (UiHandler) and instantiate a object, then pass it to background thread via constructor.
com.example.androidthreadlooperhandler.MainActivity.java
package com.example.androidthreadlooperhandler;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
static final int UIMSG3 = 3;
static final int UIMSG4 = 4;
public UiHandler uiHandler;
Button btn1, btn2;
TextView textInfo;
MyThread myThread;
private class UiHandler extends Handler{
@Override
public void handleMessage(Message msg) {
// ...Run in UI Thread
int what = msg.what;
switch (what){
case UIMSG3:
textInfo.setText("UI Message 3");
break;
case UIMSG4:
textInfo.setText("UI Message 4");
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
textInfo = (TextView)findViewById(R.id.info);
btn1.setOnClickListener(btnOnClickListener);
btn2.setOnClickListener(btnOnClickListener);
uiHandler = new UiHandler();
myThread = new MyThread(uiHandler);
myThread.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
//stop and quit the background Thread
myThread.handler.getLooper().quit();
}
View.OnClickListener btnOnClickListener =
new View.OnClickListener(){
@Override
public void onClick(View v) {
if(myThread.handler != null){
Message message;
if(v==btn1){
message = myThread.handler.obtainMessage(MyThread.MSG1);
}else{
message = myThread.handler.obtainMessage(MyThread.MSG2);
}
myThread.handler.sendMessage(message);
}
}
};
private class MyThread extends Thread{
static final int MSG1 = 1;
static final int MSG2 = 2;
public Handler handler;
private UiHandler callbackHandler;
MyThread(UiHandler handler){
callbackHandler = handler;
}
public void run(){
Looper.prepare();
handler = new MyHandler();
Looper.loop();
}
private class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
// ...Run in background
int what = msg.what;
switch (what){
case MSG1:
//doing something...
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message callbackMessage3;
callbackMessage3 = callbackHandler.obtainMessage(UIMSG3);
callbackHandler.sendMessage(callbackMessage3);
/*
runOnUiThread(new Runnable() {
@Override
public void run() {
textInfo.setText("Message 1");
}
});
*/
break;
case MSG2:
//doing something...
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message callbackMessage4;
callbackMessage4 = callbackHandler.obtainMessage(UIMSG4);
callbackHandler.sendMessage(callbackMessage4);
/*
runOnUiThread(new Runnable() {
@Override
public void run() {
textInfo.setText("Message 2");
}
});
*/
break;
}
}
}
}
}
The layout file refer to last example Thread, Handler and Looper in Android.
Next:
- Android example: pass string between threads, in Bundler