Tengo un onClickListener que desencadena una llamada de red, así que me gustaría tener alguna manera de mostrarle al usuario que las comunicaciones están en progreso. El problema al que me estoy enfrentando es que parece que no puedo lanzar un ProgressDialog o cambiar la UI de ninguna manera antes de que se realice la llamada dentro de OnClick Listener. Todo el código funciona bien, pero los cambios de la interfaz de usuario no entran en vigencia hasta que se ejecuta todo el código en onClickListener.¿OnClickListener no actualiza la UI hasta que se haya ejecutado todo el código dentro de Android?
Me preguntaba si mi problema es simplemente que una clase interna anónima como un onclicklistener solo puede actualizar la UI al final de su ejecución. O tal vez mi código es simplemente malo.
Gracias de antemano
A continuación se muestra el código para el oyente onclick:
relayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cPanel.throwProgress(NCDTCPRelayActivity.this);
System.out.println(tvSocketConnection.getText().toString());
if (relayStatusArray[relayNumber] == 0)
{
if (cPanel.TurnOnRelay(relayNumber, 1) == false)
{
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
else {
if (cPanel.TurnOffRelay(relayNumber, 1) == false){
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
cPanel.hideProgress(NCDTCPRelayActivity.this);
}
});
Aquí está el código para el throwProgress y hideProgress respectivamente (estos se encuentran en una subclase de la actividad):
public boolean throwProgress(Context mContext) {
System.out.println("INSIDE THROWPROGRESS");
try {
tempDialog = ProgressDialog.show(mContext, "Connecting", "Connecting", true);
}
catch (RuntimeException e) {
return false;
}
return true;
}
public boolean hideProgress(Context mContext) {
System.out.println("OUTSIDE THROWPROGRESS");
tempDialog.hide();
return true;
}
** Editar Aquí está el nuevo código para el OnClickListener que puse el ejecutable en:
public void onClick(View v) {
cPanel.throwProgress(NCDTCPRelayActivity.this);
System.out.println(tvSocketConnection.getText().toString());
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (relayStatusArray[relayNumber] == 0)
{
if (cPanel.TurnOnRelay(relayNumber, 1) == false)
{
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
else {
if (cPanel.TurnOffRelay(relayNumber, 1) == false){
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
cPanel.hideProgress(NCDTCPRelayActivity.this);
relayStatusArray = cPanel.getBankStatus(1);
updateButtonText();
}
});
}
Bueno, la llamada de red está en una AsyncTask, sin embargo, uso el método AsyncTask(). Execute(). Get() para que el subproceso ui espere la respuesta porque todo el programa se usa para obtener esos comandos de red al objetivo y recuperar una respuesta. Es solo un trabajo para que no tengamos una excepción de red en el hilo principal. ¿No se ejecutaría antes el código antes de la llamada antes del código? – Poodimizer
No llame a get() en el hilo principal. Anule AsyncTask.onPostExecute() y controle la respuesta allí. – gngr44
@Poodimizer ¡No hagas eso! De hecho, estás derrotando el objetivo de 'AsyncTask' para empezar convirtiéndolo en una tarea * sincrónica * innecesariamente elaborada. – Santa