2016-12-21 71 views
0

我想用一個異步工作,但我的方法是重寫從一個抽象的,我不能添加「異步任務」,以這種方法...使用異步Modifire一個抽象梅索德

這是方法:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    var _view=something; 
    await dosomthing(); 
    return _view; 
} 

// ---------------------------- 你可以看到我想要做這樣的事情。 .. 和我能找到的唯一方法是迄今爲止(請看下面的代碼)

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    var _view=null; 
    var mytsk = Task<View>.Run(async() => 
    { 
     var _view=something; 
     await dosomthing();` 
    }); 

    //I dont know where should i return my "_view" that my Ui thread dosent gets locked 
} 

如果任務完成時我寫「mytsk.result」,那麼我的用戶鎖定!!!! 如果我使用(下面的代碼)

var _view=null; 

var mytsk = Task<View>.Run(async() => 
{ 
    var _view=something; 
    await dosomthing();` 
}).wait(); 

return _view; 

那麼我的UI被鎖定...... 請對上帝的愛幫我:(

回答

-1

您只能使用async關鍵字與方法返回voidTaskTask<T>,並因爲你的首要方法返回View你不能用它async

如果當你說

Ui Get Locked !!!!

你指的是UI變得反應遲鈍,那麼你就需要從支持異步調用(如OnResume)的地方進行異步調用或訂閱事件,做它。 例如:

button.Click += async (sender, e) => 
    { 
     var _view = something; 
     await doSomethingAsync(); 
    }; 

另一種選擇是根本就沒有等待異步過程來完成,但是這取決於你的需求。

+0

謝謝你的回答....但你的回答並不幫助我...... 正如我所說:「我不知道如何返回我的觀點沒有任何UI線程鎖定... !!!」 成像你有我的問題你如何解決它? { } – MrBinary

+0

我給你多種可能性來解決你的問題(例如'button.Click + = ...')。只需選擇最適合您需求的那個...... – eitamal

1

所有UI更新必須是同步的。當平臺向您的應用程序請求查看時,它會必須立即返回視圖。你的應用程序試圖說「在我做某事的時候保持一段時間,然後我會讓你知道要顯示什麼」,這是不允許的。

要解決這個問題,您需要引入某種「加載」視圖 - 例如,只需一個佔位符或微調器或其他東西。當你的應用程序被要求查看時,可以通過開始的異步操作,然後返回「加載」視圖。稍後,當該操作完成時,您的應用程序可以將更新爲,以查看「真實」視圖。

相關問題