当我尝试 JsonConvert.DeserializeObject <T> 时,我的 xamarin 应用程序冻结

Posted

技术标签:

【中文标题】当我尝试 JsonConvert.DeserializeObject <T> 时,我的 xamarin 应用程序冻结【英文标题】:My xamarin app freezes when i try JsonConvert.DeserializeObject <T> 【发布时间】:2020-04-10 01:39:43 【问题描述】:

当我从 HttpClient () 获得 json 响应并尝试取消选区时,我的 Xamarin 应用程序冻结(UI 工作,但类 ExecuteGetRequest 第 15 行之后的代码不起作用)。可能是因为什么? 没有错误。

我调用获取动漫用户列表的方法

        ShikimoriMain shikimoriMain = new ShikimoriMain();
        var UserInformation = await shikimoriMain.GetUserInformation(Convert.ToInt64(UserID));
        var UserAnimeList = await shikimoriMain.GetUserAnimeList(Convert.ToInt64(UserID), 1, 5);
        string animeName = UserAnimeList.Anime[0].Anime.Name;

ShikimoriMain.GetUserAnimeList

    public async Task<ShikimoriUserAnimeList> GetUserAnimeList(long id, int page, int limit)
    
        string[] args = new string[]  ShikimoriCategories.UserID + "/" + id + ShikimoriCategories.UserAnimeList + $"?limit=limit&page=page" ;
        return await ExecuteGetRequest<ShikimoriUserAnimeList>(args);
    

执行获取请求

    public async Task<T> ExecuteGetRequest<T>(string[] args) where T : class
    
        T returnedObject;

        using (var client = new HttpClient())
        
            // client.BaseAddress = new Uri($"httpApiv1/args");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, httpApiv1 + String.Join("/", args));
            request.Headers.TryAddWithoutValidation("User-Agent", "Search Anime");
            HttpResponseMessage responseMessage = await client.SendAsync(request);
            string json = await responseMessage.Content.ReadAsStringAsync(); // successfully get json

            returnedObject = JsonConvert.DeserializeObject<T>(json); // after that the code is not executed

            return returnedObject;
        
    

ShikimoriUserAnimeList

public class ShikimoriUserAnimeList

    [JsonProperty()]
    public List<GetAnime> Anime  get; set; 


public class GetAnime

    [JsonProperty("id")]
    public int ID  get; set; 
    [JsonProperty("status")]
    public string Status  get; set; 
    [JsonProperty("anime")]
    public Anime Anime  get; set; 


public class Anime

    [JsonProperty("id")]
    public int ID  get; set; 
    [JsonProperty("name")]
    public string Name  get; set; 
    [JsonProperty("russian")]
    public string NameRU  get; set; 
    [JsonProperty("image")]
    public AnimeImage AnimeImage  get; set; 
    [JsonProperty("kind")]
    public string King  get; set; 
    [JsonProperty("score")]
    public string Score  get; set; 
    [JsonProperty("status")]
    public string Status  get; set; 
    [JsonProperty("episodes")]
    public int Episodes  get; set; 


public class AnimeImage

    [JsonProperty("original")]
    public string Original  get; set; 
    [JsonProperty("preview")]
    public string Preview  get; set; 
    [JsonProperty("x96")]
    public string ImageX96  get; set; 
    [JsonProperty("x48")]
    public string ImageX48  get; set; 

【问题讨论】:

您确定阻止该方法继续执行的不是异常吗?您是否尝试过用try catch block 包裹JsonConvert 来确定? 谢谢,对我有帮助。但奇怪的是设备日志中没有错误 运行应用程序时应该在输出窗口中弹出异常。我不知道为什么它不适合你。那么问题解决了吗? 如果问题得到解答并且问题得到解决,请在解决方案中添加答案并接受。 (您可以接受自己的答案)。这样做可以防止可能有帮助的人看到这个问题,认为它仍然需要答案,并为这些有帮助的人节省一些时间。 【参考方案1】:

为了完成:

一个错误被抛出,但在设备日志中不可见。将JsonConvert.DeserializeObject&lt;T&gt;(json) 包裹在try catch block 中有助于找到被抛出的Exception

try 

    returnedObject = JsonConvert.DeserializeObject<T>(json); // after that the code is not executed

    return returnedObject;

catch (Exception ex) 

 ... (debug and fix the error that occurred)

【讨论】:

【参考方案2】:

我遇到了同样的问题,我意识到使用 HttpClient async 会导致 winforms 中的 deadlockxamarin(但它Asp 配合使用效果很好),我更改了这些行

  HttpResponseMessage responseMessage = await client.SendAsync(request);
  string json = await responseMessage.Content.ReadAsStringAsync(); // successfully get json

像这些(使它们同步工作):

  HttpResponseMessage responseMessage = client.SendAsync(request).Result;
  string json = responseMessage.Content.ReadAsStringAsync().Result; // successfully get json

并将您的方法更改为默认同步

看看Here

【讨论】:

这难道不是异步的全部意义吗

以上是关于当我尝试 JsonConvert.DeserializeObject <T> 时,我的 xamarin 应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我尝试移动目录时访问被拒绝?

当我尝试包含对模拟对象的期望时,此 SecurityException 的原因是啥?

为啥当我尝试读取管道时管道会挂起?

当我尝试制作 reloadData() 时,我遇到了崩溃

当我尝试在 Android NDK 中加载冻结模型时,为啥没有注册操作?

当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?