Skip to content
pyricau edited this page Jan 13, 2012 · 8 revisions

Since AndroidAnnotations 1.0

Fork / Join for the poor Android dev

Let's say you want to split a background operation into two separate operations that run concurrently, and then do something on the UI thread when both are done.

Here is a simple way to implement this, thanks to @Background and @UiThread.

@EActivity
public class MyActivity extends Activity {

  // Instances should only be accessed from the UI Thread to guarantee thread safety
  static class ResultHolder {
    ResultA resultA;
    ResultB resultB;
  } 
 
  // Multiple clicks will start multiple distinguished computations
  @Click(R.id.myButton)
  void startForkableComputation() {
    ResultHolder resultHolder = new ResultHolder();
    computeResultA(resultHolder);
    computeResultA(resultHolder);
  }

  @Background
  void computeResultA(ResultHolder resultHolder) {
    ResultA resultA = new ResultA();
    // Do some stuff with resultA
    joinWork(resultHolder, resultA, null);
  }

  @Background
  void computeResultB(ResultHolder resultHolder) {
    ResultB resultB = new ResultB();
    // Do some stuff with resultB
    joinWork(resultHolder, null, resultB);
  }

  @UiThread
  void joinWork(ResultHolder resultHolder, ResultA resultA, ResultB resultB) {
    resultHolder.resultA = resultA;
    resultHolder.resultB = resultB;

    if (resultHolder.resultA == null || resultHolder.resultB == null) {
      return;
    }

    // Show the results on the UI Thread
  }

}

This works because we are joining the work in the UiThread, which is always the same thread.

Using AndroidAnnotations

Questions?

Enjoying AndroidAnnotations

Improving AndroidAnnotations

Clone this wiki locally