СБОЙ ТРАНЗАКЦИИ БИНДЕРА при запуске действия

Я думаю, что моя проблема может быть связана с этой записью стека ( ограничение данных для удаленного метода Android) - только размер возвращаемых данных составляет 661 КБ, и в статье говорится, что механизм связывания может поддерживать 1 МБ.

Вот ситуация: у меня есть асинхронная задача, которая принимает один параметр и вызывает веб-сервис, который возвращает список массивов строки и целочисленных значений с разделителями. Затем я беру эти значения и вставляю их в архив JAVA. В меньших наборах данных это работает отлично. В больших наборах данных (то есть в этом наборе данных 661 КБ) я получаю ошибку ниже.

LogCat:

12-12 15:33:46.118: D/ProgressBar(14998): setProgress = 0
12-12 15:33:46.118: D/ProgressBar(14998): setProgress = 0, fromUser = false
12-12 15:33:46.118: D/ProgressBar(14998): mProgress = 0mIndeterminate = false, mMin = 0, mMax = 10000
12-12 15:33:46.168: I/Async_GetAllTechSched(14998): create soap object
12-12 15:33:46.168: I/Async_GetAllTechSched(14998): create envelope
12-12 15:33:46.168: I/Async_GetAllTechSched(14998): create transport
12-12 15:33:46.208: D/ProgressBar(14998): updateDrawableBounds: left = 0
12-12 15:33:46.208: D/ProgressBar(14998): updateDrawableBounds: top = 0
12-12 15:33:46.208: D/ProgressBar(14998): updateDrawableBounds: right = 144
12-12 15:33:46.208: D/ProgressBar(14998): updateDrawableBounds: bottom = 144
12-12 15:33:51.613: D/dalvikvm(14998): GC_FOR_ALLOC freed 6262K, 37% free 18436K/29244K, paused 24ms, total 24ms
12-12 15:33:51.944: D/dalvikvm(14998): GC_FOR_ALLOC freed 594K, 36% free 18880K/29244K, paused 29ms, total 30ms
12-12 15:33:51.974: D/dalvikvm(14998): GC_FOR_ALLOC freed <1K, 34% free 19556K/29244K, paused 29ms, total 29ms
12-12 15:33:52.084: D/dalvikvm(14998): GC_FOR_ALLOC freed 2307K, 27% free 21387K/29244K, paused 20ms, total 20ms
12-12 15:33:52.204: D/dalvikvm(14998): GC_FOR_ALLOC freed 1597K, 25% free 22117K/29244K, paused 22ms, total 22ms
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): pre SOAP response
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): post SOAP response
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): PRE - add response to array
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): POST - add response to array
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): pre-intent setting
12-12 15:33:52.244: I/Async_GetAllTechSched(14998): post-intent setting
12-12 15:33:52.254: I/Async_GetAllTechSched(14998): dismiss progress
12-12 15:33:52.264: E/JavaBinder(14998): !!! FAILED BINDER TRANSACTION !!!
12-12 15:33:52.274: E/ViewRootImpl(14998): sendUserActionEvent() mView == null

Вот код, который выполняется:

Log.i("Async_GetAllTechSched", "create soap object");
SoapObject request = new SoapObject(svc_NAMESPACE, svc_METHOD_NAME);

Log.i("Async_GetAllTechSched", "create envelope");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);

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

Log.i("Async_GetAllTechSched", "create transport");
HttpTransportSE androidHttpTransport = new HttpTransportSE(svc_URL);
androidHttpTransport.debug = true;

try {

    androidHttpTransport.call(svc_SOAP_ACTION, envelope);

    Log.i("Async_GetAllTechSched", "pre SOAP response");

    // use SoapObject instead of SoapPrimitave
    SoapObject response = (SoapObject) envelope.getResponse();

    Log.i("Async_GetAllTechSched", "post SOAP response");

    // get the count of the objects returned
    int cnt = response.getPropertyCount();

    Log.i("Async_GetAllTechSched", "PRE - add response to array");

    // loop through returned object and pull out the strings
    for (int i = 0; i < cnt; i++) {

        // there should always be at least one return value
        sResponse.add(response.getProperty(i).toString());
    }

    Log.i("Async_GetAllTechSched", "POST - add response to array");

} catch (Exception e) {

    e.printStackTrace();

    Log.e("!!ERROR!!", e.getMessage());

    }

    // Log.i("return in async", "*********");
    return sResponse;
}

@Override
protected void onPostExecute(ArrayList<String> result) {



ArrayList<String> arrAllTechSchedule = new ArrayList<String>();

    // get the count prior to the for loop
    int iCnt = result.size();

    //add the result of the web service call to the main scheduling page
    for (int i = 0; i < iCnt; i++) {
        //Log.i("i = ", Integer.toString(i));

        //add the data to a ArrayList so we can add that to the adapter 
        arrAllTechSchedule.add(result.get(i).toString());   
    }       

    // lets launch the main schedule windows

    Log.i("Async_GetAllTechSched", "pre-intent setting");

    Intent intent = new Intent(_Context, ScheduleSelectTech.class);
    intent.putStringArrayListExtra("arrAllTechSchedule", arrAllTechSchedule);
    intent.putExtra("mode", "READ-ONLY");

    Log.i("Async_GetAllTechSched", "post-intent setting");

    // terminate the progress bar
    progress.dismiss();

    Log.i("Async_GetAllTechSched", "dismiss progress");

    //launch the new form
    _Context.startActivity(intent);
}

Как только намерение начато, оно не достигает новой активности. У меня есть LOG.i в onCreate, и это никогда не ударил. Время вызова процедуры не истекло. Когда я пытаюсь этот же код с меньшим количеством возвращаемых данных, я не получаю ошибку. То есть, когда я помещаю SELECT TOP 100 в оператор, который возвращает данные асинхронной задаче, это совершенно нормально.

Я предполагаю, что мой вопрос заключается в следующем - если возвращаемые данные меньше 1 МБ, почему это ошибка? И если это из-за ограничения в 1 МБ, могу ли я что-то еще сделать, чтобы обойти это ограничение или каким-то образом сжать возвращаемые данные?

Предполагаемый дизайн заключается в том, что этот первоначальный вызов возвращает имена и встречи, связанные с этими именами (с разделителями канала). Я показываю отдельный список только имен в счетчике (взятый из arraylist). Когда пользователь щелкает имя в счетчике, он запускает новое действие, в котором отображаются все встречи, связанные с этим именем (опять же, все данные, поступающие из первоначального массива). Все данные собираются в первой асинхронной задаче и просто обрабатываются. Это было сделано, чтобы уменьшить количество веб-звонков. Эта задача выполнима при 2 вызовах веб-службы, поэтому, если это ответ, то это нормально - я просто надеялся, что есть другой / лучший способ сделать это, чтобы я мог ограничить вызовы веб-службы и сократить время ожидания пользователя.

1 ответ

Решение

Есть ли что-то еще, что я могу сделать, чтобы обойти это ограничение

Конечно. Не использовать Intent дополнения для передачи данных. Или:

  • Реорганизовать это в одно действие с несколькими фрагментами, чтобы данные никогда не покидали действие, или

  • Попросите загрузку выполнить действие, которому нужны данные, или

  • Очень очень осторожно используйте статический элемент данных для передачи данных от одного действия к другому, прилагая огромные усилия, чтобы избежать утечек памяти

Другие вопросы по тегам