我想在运行Task(从API获取一些数据)之后,在UI-thread中更改我的UI元素(隐藏进度条和为listview分配数据)。我找不到API的问题,所有情况下都会返回数据。有时在运行任务后执行代码(在RunOnUiThread中)变得无响应,特别是当我在调试模式下运行代码时没有任何断点。当我在调用Task之前捕获断点并继续运行时,一切正常。
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_userData = ServiceLocator.GetService<IAuthService>().GetUserData();
_wallsViewPresenter = ViewPresenterHelper.CreateViewPresenter<WallViewPresenter, IWallView, WallActivity>(this);
_listView = FindViewById<ListView>(Resource.Id.postList);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
Task.Run(async () => {
profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile));
WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall);
_posts = (List<PostModel>) (wall.Posts.ToList());
}).ContinueWith(ar =>
{
RunOnUiThread(() => {
progressBar.Visibility = ViewStates.Gone;
_postListAdapter = new PostListAdapter(this, _posts);
_listView.Adapter = _postListAdapter;
SetListViewHeader();
_listView.AddHeaderView(_header);
FindViewById<TextView>(Resource.Id.details).Text = profile.Name;
});
});
}带委派的版本:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_userData = ServiceLocator.GetService<IAuthService>().GetUserData();
_wallsViewPresenter = ViewPresenterHelper.CreateViewPresenter<WallViewPresenter, IWallView, WallActivity>(this);
_listView = FindViewById<ListView>(Resource.Id.postList);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
Task.Run(async () => {
profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile));
WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall);
_posts = (List<PostModel>) (wall.Posts.ToList());
if (_posts.Count != 0)
{
DataPopulated?.Invoke(this, true);
}
});
DataPopulated += (sender, e) => {
RunOnUiThread(() => {
progressBar.Visibility = ViewStates.Gone;
_postListAdapter = new PostListAdapter(this, _posts);
_listView.Adapter = _postListAdapter;
SetListViewHeader();
_listView.AddHeaderView(_header);
FindViewById<TextView>(Resource.Id.details).Text = profile.Name;
});
};
}发布于 2016-09-26 08:49:35
ContinueWith是一个非常危险的低级应用编程接口,不应该在这里使用。而且,有了async/await,就不需要RunOnUIThread了。
也有可能Task.Run是不必要的,因为您正在调用的方法已经是异步的。
简化版:
protected override async void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
_userData = ServiceLocator.GetService<IAuthService>().GetUserData();
_wallsViewPresenter = ViewPresenterHelper.CreateViewPresenter<WallViewPresenter, IWallView, WallActivity>(this);
_listView = FindViewById<ListView>(Resource.Id.postList);
progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
profile = await _wallsViewPresenter.GetProfile(int.Parse(_userData.Profile));
WallModel wall = SerializationService.DeSerialize<WallModel>(profile.Wall);
_posts = (List<PostModel>) (wall.Posts.ToList());
progressBar.Visibility = ViewStates.Gone;
_postListAdapter = new PostListAdapter(this, _posts);
_listView.Adapter = _postListAdapter;
SetListViewHeader();
_listView.AddHeaderView(_header);
FindViewById<TextView>(Resource.Id.details).Text = profile.Name;
}https://stackoverflow.com/questions/39686597
复制相似问题