2017-08-13 65 views
0

我想在一些延迟后更改TextView的文本。我写了一个方法,在执行一些操作后调用。Xamarin.Android:TextView文本不会改变后Task.Delay()c#

public void Update() 
{ 
     Task.Delay(10000).ContinueWith(t => 
     { 
      dotsLoaderView.Hide(); // This works fine 
      imgOverlay.Visibility = ViewStates.Gone; // This works fine 
      ll_Info.Visibility = ViewStates.Visible; // This doesn't work 
      txt_Info.Text = "Some mesage !"; // This doesn't work 
     }); 
} 

ll_info是包含ID txt_info的TextView的线性布局的ID。 我回顾了我的layout.xml文件,在android:name标签中没有碰撞,每个id都是不同的。当我从其他任何地方更改这个textview的文本时,它可以工作,但是当我试图在Task.Delay()内部进行更改时,它不起作用。为什么?

回答

0

查看更新必须在UI线程上完成。 尝试:

public void Update() 
{ 
    Task.Delay(10000).ContinueWith(t => 
    { 
     dotsLoaderView.Hide(); 
     RunOnUiThread(delegate 
     { 
      imgOverlay.Visibility = ViewStates.Gone; 
      ll_Info.Visibility = ViewStates.Visible; 
      txt_Info.Text = "Some mesage !"; 
     }); 
    }); 
} 
0

更新使用异步,以便更容易延续的方法。

public async Task UpdateAsync() { 
    await Task.Delay(10000);//Non blocking delay on other thread 
    //Back on the UI thread 
    dotsLoaderView.Hide(); 
    imgOverlay.Visibility = ViewStates.Gone; 
    ll_Info.Visibility = ViewStates.Visible; 
    txt_Info.Text = "Some mesage !"; 
} 

,并让它在升起事件的处理程序

public async void Action(object sender, EventArgs e) { 
    await UpdateAsync(); 
} 

叫或者每一件事情在事件处理程序中完成

private event EventHandler Update = delegate { }; 

private async void OnUpdate(object sender, EventArgs e) { 
    await Task.Delay(10000);//Non blocking delay on other thread 
    //Back on the UI thread 
    dotsLoaderView.Hide(); 
    imgOverlay.Visibility = ViewStates.Gone; 
    ll_Info.Visibility = ViewStates.Visible; 
    txt_Info.Text = "Some mesage !"; 
} 

您与事件注册事件处理

Update += OnUpdate; 

并且直接在执行操作之后引发事件

Updated(this, EventArgs.Empty);