gpt4 book ai didi

c# - MvvmCross - 从 View 模型调用 Web 服务

转载 作者:太空狗 更新时间:2023-10-30 00:25:40 25 4
gpt4 key购买 nike

我是 MvvmCross 和 Android 开发的新手。我需要调用 POST 数据到我的 View 模型中的 JSON Web 服务。然后我需要在我的 UI 中显示 Web 服务的结果。我的 View 模型的要点如下所示:

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());
}
}

在我的 View (UI) 代码中,我为 Service_Finished 事件添加了一个事件处理程序。我注意到我可以从 View 模型中的“CallService”方法成功抛出事件。但是,如果我尝试从 ServiceBeginGetRequestStreamCallbackService_Completed 部分触发 Service_Finished,该事件永远不会在 UI 中触发。

由于 View 模型在可移植类库中,我不知道如何调试它。此时我知道 CallService 被成功调用。但是,我无法确定我在 ServiceBeginGetRequestStreamCallback 中到达了哪里,甚至不知道我是否到达了 Service_Completed

我从我的 Windows Phone 开发经验中知道,我需要检查我是否在 UI 线程上,如果没有,我必须做一些 Deployment.stuff。但是,对于 MvvmCross 方法,我不确定 a) 是否必须这样做以及 b) 这是否是一个选项,因为 View 模型应该适用于 Android 和 iOS。无论如何,必须有一种方法来 a) 从 View 模型调用 Web 服务和 b) 将消息发送回 View ,以便可以更新 UI。不幸的是,我似乎无法弄清楚。有人 (slodge :)) 可以告诉我我做错了什么吗?

谢谢

最佳答案

一般来说,我将这种 WebService 调用放在模型中而不是 ViewModel 中 - 它使 ViewModel 和 WebService 客户端代码的可重用性大大提高。

这方面的一些简单示例在:

I know from my Windows Phone dev experience, I would need to check to see if I'm on the UI thread, if not, I'd have to do some Deployment.stuff. But, with the MvvmCross approach, I'm not sure a) if I have to do that and

是的,来自 ViewModel->View 的所有通信都应该在 UI 线程上进行。

b) if that is even an option since the view model should work with both Android and iOS.

MvvmCross 提供了一个接口(interface),允许您将执行编码到 UI 线程上。在 ViewModel 中,这可以通过调用 InvokeOnMainThread(() => {/* your code */})

轻松完成

在幕后,MvvmCross 也会将所有 RaisePropertyChanged 执行编码到 UI 线程。 注意 - 虽然 ObservableCollection 更新不会自动编码 - 这是因为 ObservableCollection 是一个存在于 MvvmCross 之外的类。

Regardless, there has to be a way to a) call a web service from a view model and

查看示例(上方)

b) send a message back to the view so that the UI can be updated.

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

相反,您应该:

  • 更新 ViewModel 属性
  • (偶尔)通过 Messenger 发送消息

关于c# - MvvmCross - 从 View 模型调用 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com