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);
}
}