2012-11-07 33 views
0

我試圖在長時間運行時通過Toast顯示等待消息。我正在使用BackgroundWorker。 此代碼是一個ListView_ItemClick事件處理中:在Mono中長時間運行Android時無法顯示等待消息

var bgWait = new BackgroundWorker(); 
bgWait.DoWork += bgWait_DoWork; 
bgWait.RunWorkerAsync(); 
bgWait.RunWorkerCompleted += bgWait_Completed; 

在bgWait_DoWork事件處理程序的代碼如下:

private void bgWait_DoWork(object sender, DoWorkEventArgs e) 
{ 
var toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long); 
toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0); 
toastWait.Show(); 
TimeConsumingOperation(); 
toastWait.Cancel(); 
} 

當我在調試模式下運行,似乎只有從bgWait_DoWork第一線已達到 - 「var toastWait = Toast.MakeText(this,」Please wait「,ToastLength.Long);」 - 然後它跳轉到bgWait_Completed事件處理程序。

任何想法爲什麼會發生這種情況?

感謝

+0

任何錯誤,日誌,東西? – njzk2

+0

我收到與bgWait_DoWork未完成相關的錯誤。在bgWait_Completed中,我使用了bgWait_DoWork的結果,所以錯誤是正確的。 – razvanSax

+0

好吧,發佈相關的堆棧跟蹤(或任何它被稱爲單聲道),你會嗎? – njzk2

回答

2

你調用從輔助線程的用戶界面相關的API(bgWait_DoWork是在一個輔助線程執行)。

相反,您必須做這樣的事情:

private void bgWait_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Toast toastWait = null; 
    RunOnUIThread (() => 
    { 
     toastWait = Toast.MakeText(this, "Please wait", ToastLength.Long); 
     toastWait.SetGravity(GravityFlags.Top & GravityFlags.Center, 0, 0); 
     toastWait.Show(); 
    }); 
    TimeConsumingOperation(); 
    RunOnUIThread (() => 
    { 
     toastWait.Cancel(); 
    }); 
} 

}