How to pass parameters in Robospice result listener?

91 Views Asked by At

I have one request type and several request parameters. For example, i need to download some internet pages and i have param = "pageNumber". I called:

mRequest = new SpiceRaspRequest(pageNumber);
mSpiceManager.execute(mRequest, new RequestResultListener());

But in onRequestSuccess/onRequestFailure i have only "result". If i call several requests, I won't know - for what request they are, because results can fire asynchronously.

Is it possible to know - which result for what request is?

3

There are 3 best solutions below

0
Johnny Depp On BEST ANSWER

Well, i find more simple and clear way. Just create individual listener for every request:

mRequest = new SpiceRaspRequest(pageNumber);
mSpiceManager.execute(mRequest, new RequestResultListener(pageNumber));

then in listeners:

private class RequestResultListener implements RequestListener<RaspRequest> {
    private int pageNumber;

    public RequestResultListener(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    @Override
    public void onRequestFailure(SpiceException e) {
    }

    @Override
    public void onRequestSuccess(RaspRequest raspRequest) {
    }
}

Thats all! No need to override tons of code.

3
Garytech On

If you want to know the pageNumber you are getting a result for, you need to set the pageNumber in the result object after you downloaded it.

To do that, you will add a few lines in your SpiceRaspRequest and the result object ( let's call the result oject RaspPage)

public class RaspPage {

....
private int mPageNumber;

public getPageNumber() {
return mPageNumber;
}

public setPageNumber(int pageNumber) {
mPageNumber = pageNumber;
}

public class SpiceRaspRequest extends SpringAndroidSpiceRequest<RaspPage>{

int mPageNumber;
public SpiceRaspRequest(int pageNumber) {
mPageNumber = pageNumber;
RestTemplate restTemplate= getRestTemplate();

// add these lines so that the Robospice does not look for the field //pageNumber that you have added to the RestPage class.
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        converter.getObjectMapper().disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
        restTemplate.getMessageConverters().add(converter);

 }


@Overrides
public RaspPage loadDataFromNetwork throws Exception {
    ...

try {

      // before returning the result you need to set the pageNumber
      RaspPage result = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, RaspPage.class);

     result.setPageNumber(mPageNumber)

     return result;
}catch (HttpClientErrorException e) {
        message = e.getResponseBodyAsString();
        throw new SpiceException(message);
    }catch (HttpServerErrorException e) {
        message = e.getResponseBodyAsString();
        throw new SpiceException(message);
    }
 } 
}

Now let's say your activity listens to the results, you will get the results through a callback called onRequestSuccess

MainActivity extends Activity implements RequestListener<RaspPage> {

private SpiceRaspRequest;

@Overrides
public void onCreate(Bundle onSavedInstanceState) {
super.onCreate();
...
mRequest = new SpiceRaspRequest(pageNumber);
mSpiceManager.execute(mRequest, this);
}

@Overrides
public void onRequestSuccess(RaspPage result) {

int pageNumber = result.getPageNumber();
// This is the page number you are looking for
}

@Overrides
public void onRequestFailure(SpiceException spiceException) {
// TODO : do something if you failed to download the page
}

}
0
Garytech On

If you have problems when a page failed to download, here's what you should do :

When a request fails, it fires a RestClientException, that exception will be in the parameter of the callback method onRequestFailed(SpiceException e)

In order to know which pageNumber failed to download, you can extend a SpiceException

public class PageFailedException extends RestClientException {

        public int mPageNumber;

        public PageFailedException(String detailMessage) {
            super(detailMessage);
        }

        public int getPageNumber() {
            return mPageNumber;
        }

        public void setPageNumber(int mPageNumber) {
            this.mPageNumber = mPageNumber;
        }
}

Then in your loadDataFromNetwork() method you should catch the SpiceException and set the corresponding pageNumber:

try {
          ResponseEntity<RaspPage> result = restTemplate.exchange(uri, HttpMethod.GET, requestEntity, RaspPage.class);
        RaspPage raspPage = result.getBody();
            raspPage.setPageNumber(mPageNumber);

        return raspPage;
    }catch (PageFailedException e) {

        e.setPageNumber(mPageNumber);
        throw new SpiceException(e);
    }
}

And finally, in your activity/fragment you will get the pageNumber that you have failed to download:

onRequestFailed(SpiceException e) {

      if (e.getCause() instanceOf PageFailedException ) {
      PageFailedException pageFailedException = (PageFailedException) e.getCause();
      int pageFailedNumber = pageFailedException.getPageNumber();
      }
    }