СБОЙ ТРАНЗАКЦИИ БИНДЕРА при запуске действия
Я думаю, что моя проблема может быть связана с этой записью стека ( ограничение данных для удаленного метода 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
дополнения для передачи данных. Или:
Реорганизовать это в одно действие с несколькими фрагментами, чтобы данные никогда не покидали действие, или
Попросите загрузку выполнить действие, которому нужны данные, или
Очень очень осторожно используйте статический элемент данных для передачи данных от одного действия к другому, прилагая огромные усилия, чтобы избежать утечек памяти