La respuesta de Stuart aquí es correcta, pero solo quería ampliar un poco ya que todavía parece haber confusión y este es un concepto importante para diseñar aplicaciones.
Cuando se trata de cosas en la interfaz de usuario, como responder a la entrada del usuario o solicitar información, nunca desea bloquear la interfaz de usuario. Como tal, en situaciones como estas necesitas diseñar tu código de una manera que permita que se ejecute de forma asincrónica. Como ha notado, en el caso de su muestra de código, la función vuelve de inmediato ya que no esperará a que se ejecute la devolución de llamada. Si esperó, el hilo de la interfaz de usuario se bloquearía y su aplicación se congelaría, lo que seguramente no es lo que quiere.
Como no tengo contexto para esta llamada de función, crearé un ejemplo simple. Digamos que quería obtener el valor de retorno de la función y escribirla en el registro. Utilizando el enfoque sincrónico que ya ha proporcionado, eso sería algo como esto:
bool returnValue = test();
Console.WriteLine(returnValue);
En su lugar, lo que sugeriría hacer es la reestructuración del método test()
de tal manera que se comporta de forma asíncrona. Me gustaría volver a escribir a ser algo como esto:
public void test(Action<bool> callback)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.SetTitle(Android.Resource.String.DialogAlertTitle);
builder.SetIcon(Android.Resource.Drawable.IcDialogAlert);
builder.SetMessage("message");
builder.SetPositiveButton("OK", (sender, e) =>
{
callback(true);
});
builder.SetNegativeButton("NO", (sender, e) =>
{
callback(false);
});
builder.Show();
}
Esta versión es muy similar a la suya, excepto que en lugar de devolver el valor directamente de la llamada al método, se envía de nuevo a través del parámetro de devolución de llamada del método. El código para escribir en el registro puede ser actualizada a esto:
test(returnValue =>
{
Console.WriteLine(returnValue);
});
Tengo un blog post up here que también habla de diferentes maneras de hacer el trabajo en las discusiones de fondo y mostrar los resultados en la interfaz de usuario, si es que se aplica a su situación en absoluto. Espero que esto ayude a aclarar las cosas!
Comprobar esto: http://stackoverflow.com/questions/4381296/android-wait-on-user-input-from-dialog – Ponmalar
no puedo usarlo – mcxxx
yo no podía entender su respuesta ... ¿No podías ver el enlace o cualquier otra cosa? – Ponmalar