package com.neuron.trafikanten.dataProviders; import java.util.concurrent.atomic.AtomicBoolean; import android.os.Handler; import android.os.Message; public abstract class GenericDataProviderThread<T> extends Thread { private final static int MSG_DATA = 0; private final static int MSG_POSTEXECUTE = 1; private AtomicBoolean stopped = new AtomicBoolean(false); private IGenericProviderHandler<T> handler; public final Handler threadHandler = new Handler() { @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { if (stopped.get()) return; switch (msg.what) { case MSG_DATA: handler.onData( (T) msg.obj); break; case MSG_POSTEXECUTE: handler.onPostExecute((Exception) msg.obj); break; default: handler.onExtra(msg.what, msg.obj); break; } } }; public void kill() { stopped.set(true); interrupt(); } public GenericDataProviderThread() { } public GenericDataProviderThread(IGenericProviderHandler<T> handler) { this.handler = handler; } public void start(IGenericProviderHandler<T> handler) { this.handler = handler; handler.onPreExecute(); super.start(); } /* * Can be used from a thread: */ public void ThreadHandlePostExecute(Exception e) { Message msg = threadHandler.obtainMessage(MSG_POSTEXECUTE); msg.obj = e; threadHandler.sendMessage(msg); } public void ThreadHandlePostData(T data) { Message msg = threadHandler.obtainMessage(MSG_DATA); msg.obj = data; threadHandler.sendMessage(msg); } }