首先,我想说我一直在阅读https://developer.xamarin.com/guides/xamarin-forms/cloud-services/consuming/rest/指南,但它没有帮助。
我有一个phpwebservice,在被问到时会返回json:
$.ajax({
url: "/main/sub",
data: data,
traditional: true
})
它给出了这种类型的响应
<?php
include("../include/class.pdogsb.inc.php");
$pdo = PdoGsb::getPdoGsb();
$tabCabinets = $pdo->getLesCabinets();
header('Content-type: application/json');
echo json_encode(array('cabinets'=>$tabCabinets));
?>
在我的xamarin PCL项目中,我创建了一个方法,当我加载视图来获取json数据时,我使用该方法。
cabinets": [
{
"0": "1",
"1": "2,2891506",
"2": "48,8618687",
"3": "75016",
"4": "Paris",
"5": "1 Avenue Gustave V de Suède",
"id": "1",
"longitudeGPS": "2,2891506",
"latitudeGPS": "48,8618687",
"cp": "75016",
"ville": "Paris",
"rue": "1 Avenue Gustave V de Suède"
},
我的问题是,在执行和调试应用程序时,编译器不会追踪 using Newtonsoft.Json;
using suivAAndroid.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace suivAAndroid.ViewModel
{
public partial class CreerVisiteViewModel : INotifyPropertyChanged
{
#region propriétés
private Cabinet unCabinet;
private Medecin unMedecin;
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region methods
public CreerVisiteViewModel()
{
loadcabinets();
}
private async Task loadcabinets()
{
List<Cabinet> listeCabinets = null;
HttpClient clientCabinets = new HttpClient();
string url = "http://10.0.0.5/ppe3JoJuAd/gsbAppliFraisV2/webservices/w_cabinet.php";
//does not read the code after this line
var response = await clientCabinets.GetAsync(new Uri(url));
string jsonString = await response.Content.ReadAsStringAsync();
listeCabinets = JsonConvert.DeserializeObject<List<Cabinet>>(jsonString);
}
#endregion
}
}
行。相反,它返回string url = "10.0.0.5/ppe3JoJuAd/gsbAppliFraisV2/webservices/w_cabinet.php";
,这意味着客户端永远不会获取json数据。
我该怎么办?
编辑:更新了最近答案的代码
我创建了一个BaseViewModel,其中我实现了Icommand接口
loadcabinets();
以下是我以前的ViewModel
中的结果public class RelayCommandAsync : ICommand
{
private Func<object, Task> _action;
private Task _task;
public RelayCommandAsync(Func<object, Task> action)
{
_action = action;
}
public bool CanExecute(object parameter)
{
return _task == null || _task.IsCompleted;
}
public event EventHandler CanExecuteChanged;
public async void Execute(object parameter)
{
_task = _action(parameter);
OnCanExecuteChanged();
//await _task;
//OnCanExecuteChanged();
}
private void OnCanExecuteChanged()
{
var handler = this.CanExecuteChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
}
编译器没有阅读所有方法的代码仍然无法解决我的问题,我还能做些什么呢?
答案 0 :(得分:1)
这里有几个问题:
如果要使用MVVM模式,可以将代码包装在ICommand
中,并执行该命令,以填充ObservableCollection
。该命令的执行将在ViewController / Activity / Page的Lifecycle事件中发生,具体取决于您所使用的平台。