しかし、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が呼び出されることはありません。この値でOnProgressUpdateが正しく呼び出され、progressBarが画面上で更新されるため、私は500に上陸しました。
ある一定の間隔でスレッドをスリープ状態にしなければならない理由はありますか? progressBarをリアルタイムで更新するのがいいですが、半分ごとに更新する必要はありません。
1.進行状況は_lie_です。 2.「スリープに小さい値を使用した場合、初めてOnProgressUpdateが呼び出されることはありません。 - それをどうやって決めますか? – Fildor
つまり '[重いタスク]'は 'doInBackground'スレッドに' PublishProgress'を渡すべきです。 – mihail
[重い作業]は、共有ライブラリから呼び出すタスクであることを明確にする必要があります。しかし、私はこれが問題の中心だとは思わない。 whileループは私に悲しみを引き起こしているものです。私がコード例から除外したのは、入力値[0]を報告するログ出力でした。 Thread.Sleep(<500)の場合、OnProgressUpdateは一度呼び出されます(初めてPublishProgressを呼び出したとき)。 DoInBackgroundが完了するとOnProgressUpdateが呼び出される次回はある - つまり、進捗== 100私は500以上、OnProgressUpdateが呼び出されるたびにのThread.sleepを設定した場合。 – hellaandrew