Click here to Skip to main content
15,888,984 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have a big problem when I try to send big amount of data to web service. I need to send about 20-30 photos to web service. I convert all photo to base64 strings and send to web service. The problem is that when I send 1 photo is ok, but when I try to send 2 photo or more I have out of memory exception.
My code:
Java
public boolean TransferAccidentFromGisToRarParameters(List<String> photos) {
    String METHOD_NAME = "TransferAccidentFromGisToRarParameters";
    String SOAP_ACTION = NAMESPACE + METHOD_NAME;
    request = new SoapObject(NAMESPACE, METHOD_NAME);
    envelope.setOutputSoapObject(request);

    SoapObject photosList = new SoapObject(NAMESPACE, "accidentPhotos");

    for (String string : photos) {
        photosList.addProperty("string", string);
    }
    request.addSoapObject(photosList);
    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
        return Boolean.parseBoolean(response.toString());
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Where: photos - a list of base64 strings

My web service code block (asmx web service):
C#
[WebMethod]
public bool TransferAccidentFromGisToRarParameters(string[] accidentPhotos)
{
    try
    {
        foreach (var photo in accidentPhotos)
        {
            var byteArray = Convert.FromBase64String(photo);
            var accidentMedia = new AccidentMedia { Content = byteArray};
            entities.media_accidents.AddObject(accidentMedia);
        }
        entities.SaveChanges();
        return true;
    }
    catch (Exception exc)
    {
        return false;
    }
}

This is exceptions in Android log:

Java
FATAL EXCEPTION: AsyncTask 
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.OutOfMemoryError
at java.nio.CharBuffer.put(CharBuffer.java:509)
at java.nio.charset.CharsetDecoder.allocateMore(CharsetDecoder.java:238)
at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:195)
at java.nio.charset.Charset.decode(Charset.java:487)
at java.lang.String.<init>(String.java:174)
at java.lang.String.<init>(String.java:141)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:121)
at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
at com.rossoft.epolice.services.GisWebService.TransferAccidentFromGisToRarParameters(GisWebService.java:191)
at com.rossoft.epolice.asynctaskwrappers.AsyncTaskTransferAccidentWrapper.doInBackground(AsyncTaskTransferAccidentWrapper.java:48) 
at com.rossoft.epolice.asynctaskwrappers.AsyncTaskTransferAccidentWrapper.doInBackground(AsyncTaskTransferAccidentWrapper.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:264) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
</small>

I'll be glad for your answers. Best regards!
Posted
Updated 20-Nov-12 4:41am
v3

I had to do the same functionality. Uploading a camera pic ~10Mb to a remote gallery.
here is what i did:
1)resize to 1024x768 , approximate! while keeping ratio consistent
(can share code)
2)do a multi-part post http request
(this was tricky) using the apache httplib is trivial, problem is my target was 2.2 and the version of the lib was too old and not supporting that feature.
solution: bind latest jar of httplib with your app
or, stitch your http request by hand (again i can provide some code)

let me know

btw SOAP service is not what you would want to do here. handling plain old post request it is ;)
 
Share this answer
 
v2
one photo at a time. Not all photos at once.
make the loop a bit bigger, so the complete Request is carried out for each Object of the List.
 
Share this answer
 
Comments
Vladislav Socolov 20-Nov-12 5:24am    
Not it's not a solution. Imagine if instead of photo I will have a video? I need to transfer all data in one request.
TorstenH. 20-Nov-12 9:32am    
You did not say anything about videos.
How is "video" related to "photo"?
Is "video" one Object?
That code does only process "photo" to my point of view.

At least your variable naming is not clear.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900