2014-02-19 31 views
1

我想知道如何使用這個Android的AsyncTask .NET的異步庫來實現:轉換的AsyncTask到任務中MonoDroid的/ C#

public class LoadRecordTask : AsyncTask 
{ 
    private Activity1 _context; 
    private int _recordId; 

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

回答

2

您正在使用的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; 
    }); 
} 

您正在調用的方法等待需要標記爲異步。 I.e .:

private async void MyAwesomeAsyncMethod() {} 
+0

我正在使用許多異步任務,這太棒了。值得一提的是,如果你有計劃讓一個應用程序的「純粹」android/java版本,這將減緩移植過程。從Xamarin最近的成功看起來並不令人擔憂。 – samosaris