4

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_FinishedCallServiceビュー モデルの " " メソッドからイベントを正常にスローできることに気付きました。ただし、または のService_Finishedいずれかから起動しようとすると、イベントは UI で起動されません。ServiceBeginGetRequestStreamCallbackService_Completed

ビュー モデルがポータブル クラス ライブラリにあるため、これをデバッグする方法がわかりません。この時点で、CallService が正常に呼び出されていることがわかります。ただし、どこに到達しているのServiceBeginGetRequestStreamCallbackか、到達しているのかさえわかりませんService_Completed

Windows Phone 開発の経験から、UI スレッドを使用しているかどうかを確認する必要があることはわかっています。そうでない場合は、Deployment.stuff を実行する必要があります。しかし、MvvmCross アプローチでは、a) それを行う必要があるかどうか、b) ビュー モデルが Android と iOS の両方で動作する必要があるため、それがオプションであるかどうかはわかりません。とにかく、a) ビュー モデルから Web サービスを呼び出し、b) UI を更新できるようにメッセージをビューに送り返す方法が必要です。残念ながら、私はそれを理解できないようです。誰か (slodge :)) 私が間違っていることを教えてもらえますか?

ありがとうございました

4

1 に答える 1

9

一般に、この種の WebService 呼び出しは、ViewModel ではなく Model に配置します。これにより、ViewModel と WebService クライアント コードの両方がより再利用しやすくなります。

これのいくつかの簡単な例は次のとおりです。

Windows Phone 開発の経験から、UI スレッドを使用しているかどうかを確認する必要があることはわかっています。そうでない場合は、Deployment.stuff を実行する必要があります。しかし、MvvmCross アプローチでは、a) そうしなければならないかどうか、

はい、ViewModel->View からのすべての通信は UI スレッドで行う必要があります。

b) ビュー モデルは Android と iOS の両方で動作する必要があるため、それがオプションである場合。

MvvmCross は、実行を UI スレッドにマーシャリングできるようにするインターフェイスを提供します。ViewModel では、これを呼び出すことで簡単に実行できます。InvokeOnMainThread(() => { /* your code */ })

バックグラウンドで、MvvmCross はすべてのRaisePropertyChanged実行を UI スレッドにもマーシャリングします。- ただし、ObservableCollection更新は自動的にマーシャリングされません。これObservableCollectionは、クラスが MvvmCross の外部に存在するためです。

いずれにしても、a) ビュー モデルから Web サービスを呼び出し、

サンプルを参照してください (上記)

b) UI を更新できるように、ビューにメッセージを送り返します。

一般に、これらのタイプのメッセージをイベント経由で送信するべきではありません。

代わりに、次のことを行う必要があります。

  • ViewModel プロパティを更新する
  • (ときどき) メッセンジャー経由でメッセージを送信する
于 2013-04-22T08:41:42.833 に答える