我有一个ProgressDialog,用于显示加载动画和一些文本。
在AsyncTask中显示和删除它,并且在PostExecute期间,我试图在AsyncTask的DoInBackground例程中发生错误之前,在解除之前尝试使用错误消息更新ProgressDialog的文本。
我的问题是文本更新后,我需要关闭进度对话框,更新的文本显示的时间不够长。
我已经尝试过睡眠线程,但是在使用文本更新视图之前似乎发生了睡眠,因此我遇到了同样的问题。
以下是一些代码:
public class LoadRecordTask : AsyncTask
{
private Activity1 _context;
private Android.App.ProgressDialog _progressDialog;
private int _recordId;
private bool _bSuccess;
public LoadRecordTask( Activity1 outerActivity, int recordId )
{
_context = outerActivity;
_recordId = recordId;
}
protected override void OnPreExecute()
{
base.OnPreExecute();
_progressDialog = Android.App.ProgressDialog.Show( _context , "", "Loading record {0}", _recordId );
}
protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
{
_bSuccess = LoadRecord( _recordId );
if( !_bSuccess )
{
return false;
}
return true;
}
protected override void OnPostExecute(Java.Lang.Object result)
{
base.OnPostExecute(result);
if( !_bSuccess )
{
_progressDialog.SetMessage( "Error loading recording." );
}
_progressDialog.Dismiss();
}
}
答案 0 :(得分:1)
使用Handler
代替Thread
,因为当您在OnPostExecute
中呼叫时,Thread.Sleep会使主UI线程冻结。所以试试吧:
protected override void OnPostExecute(Java.Lang.Object result)
{
base.OnPostExecute(result);
if( !_bSuccess )
{
_progressDialog.SetMessage( "Error loading recording." );
}
Handler hideHandler = new Handler();
Runnable run = null;
run = new Runnable (delegate {
//Dismiss progress bar here
_progressDialog.Dismiss();
hideHandler.RemoveCallbacks(run);
}
});
hideHandler.PostDelayed(run, 2000);
}
答案 1 :(得分:1)
您正在使用的AsyncTask
可以翻译为:
_progressDialog = ProgressDialog.Show( _context , "", "Loading record {0}", _recordId );
if (await LoadRecord(_recordId))
_progressDialog.Dismiss();
else
_progressDialog.SetMessage( "Error loading recording." );
LoadRecord
可以返回Task<bool>
并且内部在Task
内运行。否则,您只需将当前使用的LoadRecord
方法包装在Task
中即可使其运行异步。
private Task<bool> LoadRecord(int recordId)
{
return Task<bool>.Run(() =>
{
//Do stuff here to fetch records
return true;
});
}
您要调用的方法需要标记为异步。即:
private async MyAwesomeAsyncMethod() {}
答案 2 :(得分:0)
_view是外部活动Activity1的私有成员,AsyncTask是一个内部类(在C#中没有对外部类的隐式引用)。它被设置为布局的根。
protected override void OnPostExecute(Java.Lang.Object result)
{
base.OnPostExecute(result);
long millis = 0;
if( !_bSuccess )
{
_progressDialog.SetMessage( "Error loading recording." );
millis = 1000;
}
_context._view.PostDelayed(()=> {_progressDialog.Dismiss();}, millis);
}