Fork join

pyricau edited this page Jan 14, 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);
    computeResultB(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) {
    if (resultA != null)
      resultHolder.resultA = resultA;
    if (resultB != null)
      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 Ui Thread, which is always the same thread. We also ensure that we always access ResultHolder from the Ui Thread.

Note by @pyricau: although I'm quite sure everything here is right and safe, I just received Java Concurrency in Practice from Amazon, so I'll read it with this fork / join use case in mind!

14/10/2018 The 4.5.1 release is out !

Using AndroidAnnotations

Questions?

Enjoying AndroidAnnotations

Improving AndroidAnnotations

Extending AndroidAnnotations

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.