DEV Community

loading...
Cover image for Asynchronous Easy pipeline in Android

Asynchronous Easy pipeline in Android

Ali Alp
“Take it easy” is nonsense , take it as hard as you can and don’t let it go :)
Updated on ・2 min read

Lets suppose the following logic in an Android Application

  • Call an API_A
  • Save the result in the local DB
  • Notify the user Interface
  • send statistic to another API_B
  • send back progress updates on each step to the caller

We know that we have to take care of all these operations in separate thread.

Find the Maven Repository here
Find the source code here

Easy-Pipeline

will take care of the above example as easy as the following code


new Pipeline(pipelineData)
        .Next(new Call_API_A(),25F)
        .Next(new Save_To_Local_DB(),50F)
        .Next(new Notify_The_UI(),75F)
        .Next(new Send_Statistics(),100F)
        .RunAsync(this,RequestCode);


Enter fullscreen mode Exit fullscreen mode

PipelineData

is the object which will travel through all the Workstations


public class PipelineData implements IPipelineData {
    //have your properties here
}

Enter fullscreen mode Exit fullscreen mode

Workstation

A step in a pipeline, in the above example Call_API_A() is a workstation


public class Call_API_A extends WorkStation {

    @Override
    protected void invoke(IPipelineData data) throws Exception {

        PipelineData pipelineData = (PipelineData) data;

        //do the work

        super.invoke(data);
    }
}

Enter fullscreen mode Exit fullscreen mode

therefore for each step or workstation you will create a class which must inherit from the WorkStation class and the PipelineData object will be available to it.

Request Code

is an integer which you need to provide the pipeline with, to be able to handle the pipeline's tasks asynchronous, therefore when the pipeline finishes its work ,means that the last workstation has finished its work then the pipeline will call its callback with its request code , therefore you can have multiple pipelines in one class.

You can use it synchronously like this


@Test
public void SyncTest() throws Exception {

    pipelineData = new PipelineData();

    PipelineData result = (PipelineData) new Pipeline(pipelineData)
            .next(new WorkStation1())
            .next(new WorkStation2())
            .next(new WorkStation3())
            .next(new WorkStation4())
            .runOnUiThread();

    Assert.assertEquals(result.getResult().size(), 4);
}



Enter fullscreen mode Exit fullscreen mode

or Asynchronously like this


@Test
public void AsyncTest() throws InterruptedException {

    pipelineData = new PipelineData();

    new Pipeline(pipelineData)
            .next(new WorkStation1(), /*progress=*/ 20F, /*requestCode=*/ 11)
            .next(new WorkStation2())
            .next(new WorkStation3(), /*progress=*/ 12F)
            .next(new WorkStation4(), /*progress=*/ 100F)
            .runAsync(this, ReqCode);

    countDownLatch.await();

    Assert.assertEquals(((PipelineData) (pipelineResult.getPipelineData())).getResult().size(), 4);
    Assert.assertEquals(pipelineResult.getRequestCode(), ReqCode);
    Assert.assertEquals(pipelineResult.isSuccess(), true);
}

@Override
public void OnResult(PipelineResult result) {
    if (result.isSuccess()) {
        Log.d("REQ-" + ReqCode, String.valueOf(result.getPipelineData()));
    } else {
        result.getException().printStackTrace();
    }

    pipelineResult = result;
    countDownLatch.countDown();
}


@Override
public void OnProgress(Integer sourcePipelineHashCode, Integer workStationRequestCode, Float progress) {
    Log.d("REQ-" + sourcePipelineHashCode, " WorkStationReqCode: " + workStationRequestCode + " progress: " + progress);
}

Enter fullscreen mode Exit fullscreen mode

you can find here the rest of the test cases

Happy coding :)

Find the Maven Repository here
Find the source code here

Discussion (0)