MvvmCross - 从视图模型调用Web服务(MvvmCross - Calling Web

2019-08-31 17:58发布

我是新来MvvmCross和Android的发展。 我有一个需要调用要发布我的视图模型数据的JSON Web服务。 然后我需要显示Web服务的结果早在我的UI。 我的视图模型的要点如下所示:

public class MyViewModel : MvxViewModel
{
  public override void Start()
  {
    base.Start();
  }

  public event EventHandler<EventArgs> Service_Finished;
  public void CallService()
  {
    string url = GetServiceUrl();

    WebRequest serviceRequest = HttpWebRequest.Create(url);
    serviceRequest.Method = "POST";
    serviceRequest.ContentType = "application/json";
    serviceRequest.BeginGetRequestStream(new AsyncCallback(ServiceBeginGetRequestStreamCallback), serviceRequest);
  }

  private void ServiceBeginGetRequestStreamCallback(IAsyncResult ar)
  {
    string json = GetJson();

    HttpWebRequest myWebRequest = (HttpWebRequest)(ar.AsyncState);
    using (Stream postStream = myWebRequest.EndGetRequestStream(ar))
    {
      byte[] byteArray = Encoding.UTF8.GetBytes(json);
      postStream.Write(byteArray, 0, byteArray.Length);
    }
    myWebRequest.BeginGetResponse(new AsyncCallback(Service_Completed), myWebRequest);
  }

  private void Service_Completed(IAsyncResult result)
  {
    if (Service_Finished != null)
      Service_Finished(this, new EventArgs());
  }
}

在我看来(UI)的代码,我已经添加了一个事件处理程序Service_Finished事件。 我注意到,我可以成功地从“扔事件CallService在我的视图模型”的方法。 但是,如果我尝试火灾Service_Finished无论从ServiceBeginGetRequestStreamCallbackService_Completed部分,该事件从未在UI解雇。

由于事实视图模型是在便携式类库,我无法弄清楚如何调试这一点。 在这一点上,我知道CallService是越来越成功调用。 然而,我不能告诉在那里我得到内ServiceBeginGetRequestStreamCallback ,如果我甚至得到Service_Completed

我知道从我的Windows Phone的开发经验,我需要检查看看,如果我在UI线程上,如果没有,我不得不做一些Deployment.stuff。 但是,随着MvvmCross的做法,我不知道一),如果我要做到这一点,B),如果这是一个连选项,因为视图模型应与Android和iOS工作。 无论如何,必须有一种方法来一)从调用视图模型Web服务和b)将消息发送回视图,以便用户界面可更新。 不幸的是,我似乎无法弄清楚。 有人(slodge :))能告诉我什么,我做错了什么?

谢谢

Answer 1:

在一般情况下,我把这种示范Web服务调用的,而不是在视图模型 - 它使双方的视图模型和WebService的客户端代码更加重用。

这方面的一些简单的例子是:

  • 在twittersearch样本- https://github.com/slodge/MvvmCross/tree/v3/Sample%20-%20TwitterSearch
  • 呆伯特样本- https://github.com/slodge/MvvmCross-Tutorials/tree/master/DailyDilbert

我知道从我的Windows Phone的开发经验,我需要检查看看,如果我在UI线程上,如果没有,我不得不做一些Deployment.stuff。 但是,随着MvvmCross的做法,我不知道一),如果我要做到这一点,

是的,从ViewModel->查看所有的沟通应该是在UI线程上。

B)如果是因为视图模型应与Android和iOS工作,即使一个选项。

MvvmCross提供了一个接口,让您编组执行到UI线程。 在一个ViewModel,这是很容易通过调用完成InvokeOnMainThread(() => { /* your code */ })

在幕后,MvvmCross还将马歇尔所有RaisePropertyChanged执行到UI线程太多。 - ObservableCollection更新不会自动整理,虽然-这是因为ObservableCollection是存在MvvmCross外的类。

无论如何,必须有一种方法来一)从调用视图模型Web服务和

见样品(上图)

B)消息发送回给视图,使得UI能够被更新。

一般来说,你不应该通过事件发送这些类型的消息。

相反,你应该:

  • 更新视图模型属性
  • (偶尔)经由信使发送的邮件


文章来源: MvvmCross - Calling Web Service from View Model