Xamarin + MvvmCross + Azure Mobile App запрос таблицы не работает - PullRequest
0 голосов
/ 26 августа 2018

Я создавал простое приложение Xamarin с использованием инфраструктуры MvvmCross вместе со службой мобильных приложений Azure для хранения и извлечения данных из облака. Проекты пользовательского интерфейса зависят от платформы.

Основной вид моего приложения показывает список сообщений, и этот список предполагается получить из облака Azure. Что происходит, так это то, что после заставки приложение просто показывает черный экран. Вызов для извлечения данных, похоже, сработал правильно, но ответ так и не был получен.

Это мои сообщения посмотреть модель:

public class PostsViewModel : MvxViewModel
    {
        readonly IPostService _postService;
        readonly IMvxNavigationService _navigationService;
        readonly MvxSubscriptionToken token;

        public PostsViewModel(IPostService postService, IMvxMessenger messenger, IMvxNavigationService navigationService)
        {
            _postService = postService;
            _navigationService = navigationService;

            token = messenger.SubscribeOnMainThread<PostsChangedMessage>
                (async mex => await LoadPosts());

            Posts = new ObservableCollection<PostViewModel>();
            AddNewPostCommand = new MvxAsyncCommand(AddNewPost);
            ShowPostDetailsCommand = new MvxAsyncCommand<PostViewModel>(ShowPostDetails);
        }

        #region Properties
        public ObservableCollection<PostViewModel> Posts { get; set; }

        private bool isLoading = true;
        public bool IsLoading
        {
            get => isLoading;
            set => SetProperty(ref isLoading, value);
        }
        #endregion

        #region Commands
        public IMvxAsyncCommand AddNewPostCommand { get; }
        private async Task AddNewPost()
        {
            await _navigationService.Navigate(typeof(PostViewModel), new Post());
        }

        public IMvxAsyncCommand<PostViewModel> ShowPostDetailsCommand { get; }
        private async Task ShowPostDetails(PostViewModel postViewModel)
        {
            await _navigationService.Navigate(typeof(PostDetailsViewModel), postViewModel);
        }
        #endregion

        #region Functions
        public override async Task Initialize()
        {
            await LoadPosts();
        }

        private async Task LoadPosts()
        {
            // Remove all counters before reloading
            Posts.Clear();

            var posts = await _postService.GetAllPosts();
            foreach(var post in posts)
            {
                var viewModel = new PostViewModel(_postService, _navigationService);
                viewModel.Prepare(post);
                Posts.Add(viewModel);
            }

            IsLoading = false;
        }
        #endregion
    }

Это мой почтовый сервис:

    public class PostService : IPostService
    {
        readonly IPostRepository _repository;
        readonly IMvxMessenger _messenger;

    public PostService(IPostRepository repository, IMvxMessenger messenger)
    {
        _repository = repository;
        _messenger = messenger;
    }

    public async Task<Post> AddNewPost(Post post)
    {
        // Just for testing purposes
        post.Date = DateTimeOffset.Now;
        // Temporary hard-coded author; this will be get from the user object 
        post.Author = "John Smith";

        await _repository.Save(post).ConfigureAwait(false);
        _messenger.Publish(new PostsChangedMessage(this));

        return post;
    }

    public async Task DeletePost(Post post)
    {
        await _repository.Delete(post).ConfigureAwait(false);
        _messenger.Publish(new PostsChangedMessage(this));
    }

    public Task<List<Post>> GetAllPosts()
    {
        return _repository.GetAll();
    }

Это мой репозиторий:

public class PostRepository : IPostRepository
{
    MobileServiceClient MobileService
        = new MobileServiceClient(@"https://vntestapp.azurewebsites.net", new LoggingHandler(true));

    IMobileServiceTable<Post> postTable;

public PostRepository()
{
    postTable = MobileService.GetTable<Post>();
}

public Task Delete(Post post)
{
    return postTable.DeleteAsync(post);
}

public async Task<List<Post>> GetAll()
{
    return await postTable.ToListAsync();
}

public async Task<Post> Save(Post post)
{
    await postTable.InsertAsync(post);
    return post;
}

}

1 Ответ

0 голосов
/ 26 августа 2018

Используйте конструкцию Task.Run () для вызова API, если запущенной платформой является android.

Из моего практического опыта работы с Mvvmcross, иногда в android ожидался вызов внутри асинхронного метода, блокирующего этот поток и егоникогда не возвращается,

В этом случае, если вы вызываете его внутри Task.Run (), он просто отлично работает.Хотя в iOS такой проблемы нет.

Я бы искал более глубокое объяснение, чтобы объяснить причину этого.

...