Как получить возвращаемый результат от функции в Task.Run (Xamarin.Android)? - PullRequest
0 голосов
/ 11 января 2019

В моей деятельности есть следующие представления:

private Button btn;
private TextView txtView;

У меня есть следующее событие нажатия кнопки:

private async void Btn_Click(object sender, System.EventArgs e)
{
     var mDialog = new ProgressDialog(this);
     mDialog.SetMessage("Loading data...");
     mDialog.SetCancelable(false);
     mDialog.Show();

     string str;

     await Task.Run((() => str = Foo()));
     // Alternatively
     // await Task.Delay(10000);

     mDialog.Dismiss();

     txtView.Text = str;


}

И у меня также есть следующий метод:

string Foo()
{
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(1000);
    }

    return "hello";
}

Мне нужно, чтобы txtView.Text был установлен на hello после отклонения ProgressDialog

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Решение:

Вы можете настроить прослушиватель при отклонении с помощью SetOnDismissListener, чтобы выполнить некоторую работу после отклонения ProgressDialog.

Во-первых, пусть ваша деятельность наследуется от IDialogInterfaceOnDismissListener:

public class MainActivity : AppCompatActivity, IDialogInterfaceOnDismissListener

В вашем событии нажатия кнопки установите activity как listener:

        private async void Btn_Click(object sender, System.EventArgs e)
    {
        var mDialog = new ProgressDialog(this);
        mDialog.SetMessage("Loading data...");
        mDialog.SetCancelable(false);

        //set your activity as the listener
        mDialog.SetOnDismissListener(this);

        mDialog.Show();
        await Task.Delay(10000);
        mDialog.Dismiss();

    }

Затем вы должны реализовать элемент интерфейса (IDialogInterfaceOnDismissListener) OnDismiss, в этой функции вы можете делать все, что захотите, после закрытия ProgressDialog:

public void OnDismiss(IDialogInterface dialog)
{

    Toast.MakeText(this, "You used the 'SetOnDismissListener'.", ToastLength.Long).Show();

    txtView.Text = "hello";
}

Вы можете сослаться:

IDialogInterfaceOnDismissListener

с помощью-setondismisslistener-с-диалога

0 голосов
/ 11 января 2019

Task.Run не предназначен для такого использования, поскольку он ставит в очередь заданную работу для выполнения на ThreadPool и возвращает задание или Task<TResult> дескриптор для этой работы.

Что вам нужно сделать, это создать метод с типом возвращаемого значения Task<string> и затем ждать этого метода

Затем используйте этот метод для обновления ваших текстовых данных

...