Skip to content

Instantly share code, notes, and snippets.

@uchidev
Last active March 13, 2016 02:14
Show Gist options
  • Select an option

  • Save uchidev/bbca33f65a7a7265cfe0 to your computer and use it in GitHub Desktop.

Select an option

Save uchidev/bbca33f65a7a7265cfe0 to your computer and use it in GitHub Desktop.
import android.support.annotation.Nullable;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import java.lang.ref.WeakReference;
public abstract class ThreadModule {
private Handler mHandler;
private boolean mInitialized = false;
public void initialize() {
new Thread(new ThreadModuleRunner(this)).start();
}
@Nullable
public Handler isReadyThread() {
return getHandler();
}
public boolean finish() {
Handler handler = getHandler();
if (handler != null) {
handler.getLooper().quit();
return true;
} else {
return false;
}
}
public boolean sendMessage(Message msg) {
return mHandler.sendMessage(msg);
}
public abstract void handleMessage(Message msg);
private synchronized Handler getHandler() {
return mInitialized ? mHandler : null;
}
private synchronized void setInitialized(Handler handler) {
mInitialized = true;
mHandler = handler;
}
private static class ThreadModuleRunner implements Runnable {
private final WeakReference<ThreadModule> moduleRef;
public ThreadModuleRunner(ThreadModule module) {
moduleRef = new WeakReference<>(module);
}
@Override
public void run() {
Looper.prepare();
if (initializeModule()) Looper.loop();
/* Thread end */
}
private boolean initializeModule() {
ThreadModule module = moduleRef.get();
if (module != null) {
Handler handler = new ThreadModuleHandler(module);
module.setInitialized(handler);
return true;
} else {
return false;
}
}
}
private static class ThreadModuleHandler extends Handler {
private final WeakReference<ThreadModule> moduleRef;
public ThreadModuleHandler(ThreadModule module) {
super();
moduleRef = new WeakReference<>(module);
}
@Override
public void handleMessage(Message msg) {
ThreadModule module = moduleRef.get();
if (module == null) {
getLooper().quit();
} else {
module.handleMessage(msg);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment