然而,使用Xamarin.Android,我不認爲這是我的問題背後的原因。爲什麼AsyncTask中的OnProgressUpdate不被調用?
我面臨的問題是OnProgressUpdate方法只在AsyncTask對象中調用一次,我正在使用它來處理後臺任務。這裏是我的課:
public class DBInflater : AsyncTask
{
private int progress;
private ProgressBar progressBar;
public DatabaseInflater(ProgressBar progressBar)
{
this.progressBar = progressBar;
}
protected override void OnPreExecute()
{
base.OnPreExecute();
}
protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
{
System.Threading.Tasks.Task.Run([some heavy task]);
while (progress < 100)
{
Java.Lang.Thread.Sleep(500);
PublishProgress(progress);
progress += 1;
}
return true;
}
protected override void OnProgressUpdate(params Java.Lang.Object[] values)
{
progressBar.Progress = progress;
}
protected override void OnPostExecute(Java.Lang.Object result)
{
base.OnPostExecute(result);
}
}
我已經成功地縮小問題這一行:Java.Lang.Thread.Sleep(500); 如果我使用較小的睡眠值,OnProgressUpdate將不會在第一次後調用。我登陸500,因爲有了這個值,OnProgressUpdate被正確調用並且progressBar在屏幕上更新。
是否有一個原因,我必須在一定的時間間隔睡覺線程?我希望progressBar能夠實時更新,而不是每半秒鐘更新一次。
1.您的進度是_lie_。 2.「如果我使用較小的值進行睡眠,則OnProgressUpdate將在第一次後不會被調用。」 - 如何確定? – Fildor
換句話說''[一些繁重的任務]'應該'PublishProgress'到'doInBackground'線程中。 – mihail
我應該澄清[某些繁重的任務]是我從共享庫調用的任務。但是,我不認爲這是問題的核心。 while循環是什麼讓我悲傷。我的代碼示例中遺漏了一些Log輸出報告傳入值[0]的值。如果我Thread.Sleep(<500),OnProgressUpdate被調用一次(我第一次稱爲PublishProgress)。下次調用OnProgressUpdate時,一旦DoInBackground完成 - 換句話說,進度== 100.當我將Thread.Sleep設置爲500或更大時,OnProgressUpdate每次都會被調用。 – hellaandrew