OnPostExecute не выполняется в AsyncTask (C#)

Я делаю приложение для Android в Xamarin Studio, но OnPostExecute() не выполняется.

В пределах DoInBackground() метод, у меня есть это:

protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] native_parms) {
    System.IO.Stream ins = null;
    try {
        URL url = new URL(this.url);
        HttpURLConnection conn = (HttpURLConnection) url.OpenConnection();
        conn.ReadTimeout = 10000;
        conn.ConnectTimeout = 15000;
        conn.RequestMethod = "GET";
        conn.DoInput = true;
        conn.DoOutput = true;

        Dictionary<string, string> queryParams = new Dictionary<string, string>();
        queryParams.Add("username", this.username);
        queryParams.Add("password", this.password);

        System.IO.Stream os = conn.OutputStream;
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
        // getQueryString() just builds a query string
        writer.Write(getQueryString(queryParams));

        writer.Flush();
        writer.Close();
        os.Close();

        // Starts the query
        conn.Connect();
        int response = (int) conn.ResponseCode;
        System.Console.WriteLine(response);
        ins = conn.InputStream;

        // Convert the InputStream into a string
        String contentAsString = read(ins, conn.ContentLength);
        System.Console.WriteLine("Done the task.");
        return contentAsString;

        // Makes sure that the InputStream is closed after the app is
        // finished using it.
    }
    finally {
        if (ins != null) {
            ins.Close();
        }
    }
}

И тогда это буквально OnPostExecute() метод:

protected override void OnPostExecute(AsyncTaskResult<bool, Error> result) {
    System.Console.WriteLine("On post execute");
}

Я просто звоню AsyncTask.execute() метод.

И угадайте, что, это вывод:

Done the task.

Как так? И, что более важно, как я могу это исправить?

2 ответа

Я (все еще) не знаю, почему это не будет работать с параметрами типа. Однако для того, чтобы все заработало, вам просто нужно удалить часть обобщения:

public class YourTask : AsyncTask { ... }

а затем замените все вхождения параметров публикации, прогресса или результата на Java.Lang.Object:

protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] parms) { ... }

protected override void OnPostExecute(Java.Lang.Object result) { ... }

Вот пример с универсальным AsyncTask, который работает. Я не знаю, в чем именно заключается ваша проблема, так как вы все еще не показываете весь соответствующий код. Тем не менее, переопределение OnPostExecute(результат AsyncTaskResult) на первый взгляд кажется мне неправильным - обратите внимание, что моя версия использует TResult в качестве типа parmater (int в моем случае).

public class MyTask: AsyncTask<string, int, int>
    {
        protected MyTask(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {

        }
        public MyTask()
        {

        }

        protected override int RunInBackground(params string[] @params)
        {
            return 4;
        }

        protected override void OnPostExecute(int result)
        {
            System.Console.WriteLine("On post execute");
            base.OnPostExecute(result);
        }
    }
Другие вопросы по тегам