package org.schmivits.airball.dataproxy.data; import java.io.PrintWriter; import java.io.StringWriter; import android.content.Context; public abstract class ConcurrentProcess extends AbstractProcess implements Runnable { private static final long DELAY_TILL_CLEANUP = 1000L; private final Thread mThread; private boolean mRunning = true; protected ConcurrentProcess(Context context, ProcessNode parent, String title) { super(context, parent, title); (mThread = new Thread(this)).start(); } @Override public final void run() { setRunMode(RunMode.RUNNING); try { doRun(); } catch (Exception e) { setStatus(stackTrace(e)); } finally { setRunMode(RunMode.FINISHED); arrangeCleanup(); } } private String stackTrace(Exception e) { StringWriter sb = new StringWriter(); e.printStackTrace(new PrintWriter(sb)); return sb.toString(); } private void arrangeCleanup() { if (getParent() != null) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(DELAY_TILL_CLEANUP); } catch (InterruptedException e) { } getParent().cleanupChild(ConcurrentProcess.this); } }).start(); } } @Override public void signal() { // Two ways to tell the thread to shut down: Turn off the // flag, and send it an interrupt. Either one should work. mRunning = false; mThread.interrupt(); setRunMode(RunMode.SIGNALED); super.signal(); } protected boolean isRunning() { return mRunning; } protected abstract void doRun() throws InterruptedException; }