在解雇之前更新ProgressDialog的文本

时间:2014-02-18 19:10:39

标签: android xamarin.android

我有一个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();
    }
}

3 个答案:

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