我是MvvmCross和Android开发的新手。我需要在我的视图模型中调用一个JSON Web服务来POST数据。然后,我需要将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
" 方法中抛出该事件。然而,如果我尝试从 ServiceBeginGetRequestStreamCallback
或 Service_Completed
部分触发 Service_Finished
,则该事件在 UI 中永远不会被触发。由于视图模型位于便携式类库中,我无法弄清楚如何调试此问题。此时,我知道 CallService 被成功调用。但是,我无法确定我是否在
ServiceBeginGetRequestStreamCallback
中,并且我是否甚至到达了 Service_Completed
。从我的 Windows Phone 开发经验中,我知道我需要检查是否在 UI 线程上,如果没有,我需要做一些 Deployment.stuff。但是,使用 MvvmCross 方法,我不确定是否必须这样做,以及是否是一个选项,因为视图模型应该适用于 Android 和 iOS。无论如何,必须有一种方法 a) 从视图模型调用 Web 服务并 b) 发送消息回视图,以便可以更新 UI。不幸的是,我似乎无法弄清楚。可以有人(slodge :)) 告诉我我做错了什么吗?
谢谢