web-dev-qa-db-ja.com

XamarinでRunOnUIThread()を使用する方法Android

OStateUserIdオブジェクトに結果を取得した後、このステートメントを実行したいと思います。

_details.Text = OStateUserID.name + "\n" + OStateUserID.population);_

_bStateuserID.Click +=  async delegate 
{
    details.Text=" ";
    Guid x = new Guid("33F8A8D5-0DF2-47A0-9C79-002351A95F88");
    state OStateUserID =(state) await obj.GetStateByUserId(x.ToString());
    details.Text = OStateUserID.name + "\n" + OStateUserID.population);
};
_

GetStateByUserId()メソッドは_class State_のオブジェクトを返します。

非同期で実行されます。操作が完了したら、namepopulationをTextViewの詳細に割り当てたいと思います。

この場合、どうすればRunOnUIThread()を使用できますか?

9
Suraj

あなたはする必要はありません。

あなたが投稿したこのコードでは:

bStateuserID.Click +=  async delegate 
{
    details.Text=" ";
    Guid x = new Guid("33F8A8D5-0DF2-47A0-9C79-002351A95F88");
    state OStateUserID =(state) await obj.GetStateByUserId(x.ToString());
    details.Text = OStateUserID.name + "\n" + OStateUserID.population);
};

この線

details.Text = OStateUserID.name + "\n" + OStateUserID.population);

はすでにUIスレッドで実行されています。

この動作を説明する async intro がブログにあります。

6
Stephen Cleary

あなたは適切な関数名を持っているので、どうしてそれを見逃したのかわかりません。とにかく、ラムダ式でそれを行うことができます:

Activity.RunOnUiThread(() => {
    details.Text = OStateUserID.name + "\n" + OStateUserID.population;
});

または、そのためのメソッドを作成することもできます

Activity.RunOnUiThread(Action);

private void Action() 
{ 
    details.Text = OStateUserID.name + "\n" + OStateUserID.population;
}

後者の場合、まだそうでない場合は、変数をプライベートフィールドに格納する必要があります。最初のケースでは、変数がRunOnUiThread呼び出しと同じスコープ内にある場合に機能します。

15
ForceMagic