#android #iis #android-asynctask #asmx #wsdl2code
#Android #iis #android-asynctask #asmx #wsdl2code
Вопрос:
Я гуглю около нескольких часов по этой проблеме. Но я не могу найти решение. Следовательно, надеюсь, что кто-нибудь может дать мне какую-то идею.
Моя проблема в том, что асинхронный onPostExecute не достигнут. Однако всякий раз, когда я перезапускаю свой IIS 7.5 на своем ноутбуке. Асинхронность может работать нормально. Через несколько раз метод async вызывается повторно, асинхронный onPostExecute снова не достигается, это заняло много времени в фоновом режиме, бесконечно.
Я поставил try catch в doInBackground, но ошибка не обнаружена.
Спасибо.
ActivityMain.java
@Override
protected void onCreate(Bundle savedInstanceState)
{
UpdateServingNo_EstimatedTime();
}
public void UpdateServingNo_EstimatedTime()
{
new AsyncTask<Void, Void, String>()
{
@Override
protected void onPreExecute()
{
ActivityMain.this.setProgressBarIndeterminateVisibility(true);
};
@Override
protected String doInBackground(Void... params)
{
String result = "0";
try
{
Service_eGiliran service = new Service_eGiliran();
servingNumCounter1 = service.GetCurrentServingNoByStatus("COUNTER1");
servingNumCounter2 = service.GetCurrentServingNoByStatus("COUNTER2");
servingNumRoom1 = service.GetCurrentServingNoByStatus("ROOM1");
servingNumRoom2 = service.GetCurrentServingNoByStatus("ROOM2");
servingNumRoom3 = service.GetCurrentServingNoByStatus("ROOM3");
servingNumPharmacy1 = service.GetCurrentServingNoByStatus("PHARMACY1");
servingNumPharmacy2 = service.GetCurrentServingNoByStatus("PHARMACY2");
avgScdCounter1 = service.GetAvgSecondsByStatus("COUNTER1")!=0 ? service.GetAvgSecondsByStatus("COUNTER1")/60: 0; // min = seconds/60
avgScdCounter2 = service.GetAvgSecondsByStatus("COUNTER2")!=0 ? service.GetAvgSecondsByStatus("COUNTER2")/60: 0;
avgScdRoom1 = service.GetAvgSecondsByStatus("ROOM1")!=0 ? service.GetAvgSecondsByStatus("ROOM1")/60: 0;
avgScdRoom2 = service.GetAvgSecondsByStatus("ROOM2")!=0 ? service.GetAvgSecondsByStatus("ROOM2")/60: 0;
avgScdRoom3 = service.GetAvgSecondsByStatus("ROOM3")!=0 ? service.GetAvgSecondsByStatus("ROOM3")/60: 0;
avgScdPharmacy1 = service.GetAvgSecondsByStatus("PHARMACY1")!=0 ? service.GetAvgSecondsByStatus("PHARMACY1")/60: 0;
avgScdPharmacy2 = service.GetAvgSecondsByStatus("PHARMACY2")!=0 ? service.GetAvgSecondsByStatus("PHARMACY2")/60: 0;
result = "1";
}
catch (Exception e)
{
result = e.getMessage();
}
return resu<
}
@Override
protected void onPostExecute(String result)
{
ActivityMain.this.setProgressBarIndeterminateVisibility(false);
if(result.equals("1"))
{
//Update UI label serving number
lblCounter1Ticket.setText(Integer.toString(servingNumCounter1));
lblCounter2Ticket.setText(Integer.toString(servingNumCounter2));
lblRoom1Ticket.setText(Integer.toString(servingNumRoom1));
lblRoom2Ticket.setText(Integer.toString(servingNumRoom2));
lblRoom3Ticket.setText(Integer.toString(servingNumRoom3));
lblPharmacy1Ticket.setText(Integer.toString(servingNumPharmacy1));
lblPharmacy2Ticket.setText(Integer.toString(servingNumPharmacy2));
lblCounter1Time.setText(avgScdCounter1 " min");
lblCounter2Time.setText(avgScdCounter2 " min");
lblRoom1Time.setText(avgScdRoom1 " min");
lblRoom2Time.setText(avgScdRoom2 " min");
lblRoom3Time.setText(avgScdRoom3 " min");
lblPharmacy1Time.setText(avgScdPharmacy1 " min");
lblPharmacy2Time.setText(avgScdPharmacy2 " min");
}
else
{
Toast.makeText(ActivityMain.this, "Error: " result, Toast.LENGTH_SHORT).show();
}
}
}.execute();
}
Service_eGiliran.java является ли мой веб-сервис порожденным java-заглушкой из www.wsdl2code.com загрузив файлы .asmx.
Service_eGiliran.java
public int GetCurrentServingNoByStatus(String status, List<HeaderProperty> headers)
{
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.implicitTypes = true;
soapEnvelope.dotNet = true;
SoapObject soapReq = new SoapObject("http://tempuri.org/", "GetCurrentServingNoByStatus");
soapReq.addProperty("status", status);
soapEnvelope.setOutputSoapObject(soapReq);
HttpTransportSE httpTransport = new HttpTransportSE(url, timeOut);
try
{
if(headers != null)
{
httpTransport.call("http://tempuri.org/GetCurrentServingNoByStatus", soapEnvelope, headers);
}
else
{
httpTransport.call("http://tempuri.org/GetCurrentServingNoByStatus", soapEnvelope);
}
Object retObj = soapEnvelope.bodyIn;
if(retObj instanceof SoapFault)
{
SoapFault fault = (SoapFault) retObj;
Exception ex = new Exception(fault.faultstring);
if(eventHandler != null) eventHandler.Wsdl2CodeFinishedWithException(ex);
}
else
{
SoapObject result = (SoapObject) retObj;
if(result.getPropertyCount() > 0)
{
Object obj = result.getProperty(0);
if(obj != null amp;amp; obj.getClass().equals(SoapPrimitive.class))
{
SoapPrimitive j = (SoapPrimitive) obj;
int resultVariable = Integer.parseInt(j.toString());
return resultVariable;
}
else if(obj != null amp;amp; obj instanceof Number)
{
int resultVariable = (Integer) obj;
return resultVariable;
}
}
}
}
catch (Exception e)
{
if(eventHandler != null) eventHandler.Wsdl2CodeFinishedWithException(e);
e.printStackTrace();
}
return -1;
}
LogCat
Комментарии:
1. Тот
GetCurrent...
, который вы вызываете, отличается от того, который вы опубликовали, поскольку он имеет два параметра. Из другой функции вы не опубликовали код. Вы выполняете ужасно много вызовов, которые все выглядят одинаково. Это хорошая идея? Поэтому он зависает в фоновом режиме. Вы должны выяснить, когда en для какого оператора. Вы должны выяснить, зависает ли сервер.
Ответ №1:
Я решил эту проблему самостоятельно.
Я изменил метод веб-службы таким образом.
В предыдущей версии я делал много вызовов для аналогичного действия. Поэтому я изменил его и собрал все данные, которые я хочу, с помощью async, чтобы снизить нагрузку на сервер.
Возможно, это не лучшее решение. Но я надеюсь, что этот пост может помочь всем, кто столкнулся с подобной проблемой.
После модифицированной версии (асинхронная задача)
@Override
protected String doInBackground(Void... params)
{
String result = "";
try
{
Service_eGiliran service = new Service_eGiliran();
String strResultServingNo = service.GetAllServingNo();
String strResultAvgSeconds = service.GetAllAvgSeconds();
result = "1";
}
catch (Exception e)
{
result = e.getMessage();
}
return resu<
}
Перед модифицированной версией (асинхронная задача)
@Override
protected String doInBackground(Void... params)
{
String result = "0";
try
{
Service_eGiliran service = new Service_eGiliran();
servingNumCounter1 = service.GetCurrentServingNoByStatus("COUNTER1");
servingNumCounter2 = service.GetCurrentServingNoByStatus("COUNTER2");
servingNumRoom1 = service.GetCurrentServingNoByStatus("ROOM1");
servingNumRoom2 = service.GetCurrentServingNoByStatus("ROOM2");
servingNumRoom3 = service.GetCurrentServingNoByStatus("ROOM3");
servingNumPharmacy1 = service.GetCurrentServingNoByStatus("PHARMACY1");
servingNumPharmacy2 = service.GetCurrentServingNoByStatus("PHARMACY2");
avgScdCounter1 = service.GetAvgSecondsByStatus("COUNTER1")!=0 ? service.GetAvgSecondsByStatus("COUNTER1")/60: 0; // min = seconds/60
avgScdCounter2 = service.GetAvgSecondsByStatus("COUNTER2")!=0 ? service.GetAvgSecondsByStatus("COUNTER2")/60: 0;
avgScdRoom1 = service.GetAvgSecondsByStatus("ROOM1")!=0 ? service.GetAvgSecondsByStatus("ROOM1")/60: 0;
avgScdRoom2 = service.GetAvgSecondsByStatus("ROOM2")!=0 ? service.GetAvgSecondsByStatus("ROOM2")/60: 0;
avgScdRoom3 = service.GetAvgSecondsByStatus("ROOM3")!=0 ? service.GetAvgSecondsByStatus("ROOM3")/60: 0;
avgScdPharmacy1 = service.GetAvgSecondsByStatus("PHARMACY1")!=0 ? service.GetAvgSecondsByStatus("PHARMACY1")/60: 0;
avgScdPharmacy2 = service.GetAvgSecondsByStatus("PHARMACY2")!=0 ? service.GetAvgSecondsByStatus("PHARMACY2")/60: 0;
result = "1";
}
catch (Exception e)
{
result = e.getMessage();
}
return resu<
}