Скачать большие файлы с сервера с помощью SOAP в Android? Я использую библиотеку ksoap2. файлы больше 30МБ выбрасывает OutOfMemoryError - PullRequest
0 голосов
/ 30 августа 2018
 HttpTransportSE androidHttpTransport = new HttpTransportSE(URL_GET_FILE);
androidHttpTransport.debug = true;
try {
    androidHttpTransport.call(SOAP_ACTION_GET_FILE, envelope);

        StringBuffer theresponseString = new StringBuffer(androidHttpTransport.responseDump);

    if( !(envelope.bodyIn instanceof SoapFault)) {

        {
            byte[] arrby = Base64.decode((String) ((SoapObject) envelope.bodyIn).getPropertyAsString("file").toString(), Base64.DEFAULT);
            Log.e("Byte", arrby.toString());

            FileOutputStream output;

                output = new FileOutputStream(dir + "/" + requiredFiles.getPath());
                output.write(arrby);

            output.flush();
            output.close();
            status = true;

    }
}
catch (SoapFault fault)
{
    status = false;
    fault.printStackTrace();
}
catch (Exception e) {
    status = false;
    e.printStackTrace();
}

Приведенный выше код используется для загрузки файлов, когда размер файла превышает 30 МБ, он выдает OutOfMemoryError в байт [].

Пожалуйста, помогите мне исправить решение. Заранее спасибо ... !!!

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете скачать файл в размере куска и добавить его к одному и тому же файлу для каждого размера куска. Ниже приведен пример кода:

  @Override
protected Void doInBackground1(RequiredFiles... params) {

    FileOutputStream output;
    requiredFiles = params[0];

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_GET_FILE);
    // adding method property here serially
    request.addProperty("serverKey", serverKey); 
    request.addProperty("hardwareKey", CommonFunctions.getUUID(context).toString()); 
    request.addProperty("fileId", requiredFiles.getId());
    request.addProperty("fileType", requiredFiles.getType());
    request.addProperty("chunkOffset", requiredFiles.getDefaultChuckOFFSet());
    request.addProperty("chuckSize", requiredFiles.getDefaultChuckSize());

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);

    envelope.implicitTypes = true;
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);


    String URL_GET_FILE = baseURL + UrlApiResource.GET_FILE;
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL_GET_FILE);
    androidHttpTransport.debug = true;
    try {
        androidHttpTransport.call(SOAP_ACTION_GET_FILE, envelope);

        if( !(envelope.bodyIn instanceof SoapFault)) {

            byte[] arrby = Base64.decode((String) ((SoapObject) envelope.bodyIn).getPropertyAsString("file"), Base64.DEFAULT);

            try {

                output = new FileOutputStream(dir + "/temp_" + requiredFiles.getPath(), true);
                output.write(arrby);
                output.flush();
                output.close();
            }catch (IOException ex){
                ex.printStackTrace();

            }//catch
        }//if

        status = true;
    } catch (SoapFault fault) {
        status = false;
        fault.printStackTrace();
    }catch (IOException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        status = false;
        e.printStackTrace();
        }
        return null; 
}
...