Last active
March 13, 2016 02:14
-
-
Save uchidev/bbca33f65a7a7265cfe0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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