Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法在通过调试器部署时正常工作,但在导出APK时相同的方法不工作_C#_Rest_Xamarin_Xamarin.android - Fatal编程技术网

C# 方法在通过调试器部署时正常工作,但在导出APK时相同的方法不工作

C# 方法在通过调试器部署时正常工作,但在导出APK时相同的方法不工作,c#,rest,xamarin,xamarin.android,C#,Rest,Xamarin,Xamarin.android,我在部署Xamarin.Android中生成的APK(来自我设备的Logcat)时遇到这个错误 但是,此错误仅在安装应用程序并从导出的APK执行时发生。当我使用VisualStudio调试器时,该方法运行良好 我试图将该方法放在一个独立的类中或活动中(甚至将该方法的一部分放在onCreate()方法中),更改访问级别,但没有任何效果 编辑 谢谢大家的回答,并给我一些关于这个问题的想法。在做了一些测试之后,我发现当在项目属性的编译部分启用“优化代码”时会出现问题。在Xamarin.Android中

我在部署Xamarin.Android中生成的APK(来自我设备的Logcat)时遇到这个错误

但是,此错误仅在安装应用程序并从导出的APK执行时发生。当我使用VisualStudio调试器时,该方法运行良好

我试图将该方法放在一个独立的类中或活动中(甚至将该方法的一部分放在onCreate()方法中),更改访问级别,但没有任何效果

编辑


谢谢大家的回答,并给我一些关于这个问题的想法。在做了一些测试之后,我发现当在项目属性的编译部分启用“优化代码”时会出现问题。在Xamarin.Android中,要导出已签名的APK,首先需要在“发布”模式下设置项目,当然,默认情况下会启用此选项。我不确定这是编译器的错误还是我的错,所以我会继续调查:)。无论如何,再次感谢您的帮助。

分析错误的来源:

根据LogCat,您得到错误是因为
SendJson
函数中的一些代码。 但唯一可能导致问题的代码是这一行:

var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
这是因为代码的其余部分在try的帮助下实现了错误处理。但是,上面的行没有任何try-catch来捕获代码引发的异常

解决问题:

正确的解决方法是首先防止错误发生

  • 您正在将using语句用于您的。您可能希望改为使用静态httpclient,如下所示
  • 看起来您正面临这个问题,因为您没有使用异步调用,所以您的客户机结果是空的
  • 您尝试捕获似乎捕获了该错误,但是您的“GetResponseStream()也为null。因此,您的应用程序尝试对null对象执行
    ReadToEnd()
    。这会导致崩溃。因此,请摆脱该问题,而只需使用通用异常
    catch(exception ex)
    ,这样您就可以返回收到的错误消息。 以下是您可以做的:
statichttpclient=newhttpclient();
公共任务SendJsonAsync(字符串Json,字符串Route=“MyRoute”,字符串Token=“MyToken”)
{
尝试
{
client.Headers[HttpRequestHeader.ContentType]=“application/json”;
client.Headers[HttpRequestHeader.Authorization]=“Token Token=“+Token;
string response=wait client.UploadStringAsync(路由“POST”,Json);
返回响应;
}
捕获(例外情况除外)
{
var响应=例如消息;
返回响应;
}
} 

分析错误来源:

根据LogCat,您得到错误是因为
SendJson
函数中的一些代码。 但唯一可能导致问题的代码是这一行:

var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
这是因为代码的其余部分在try的帮助下实现了错误处理

解决问题:

正确的解决方法是首先防止错误发生

  • 您正在将using语句用于。您可能希望改为使用静态httpclient,如下所示
  • 看起来您正面临这个问题,因为您没有使用异步调用,所以您的客户机结果是空的
  • 您尝试捕捉似乎捕捉到了该错误,但是您的“GetResponseStream()也为空。因此,您的应用程序尝试对空对象执行
    ReadToEnd()
    。这就导致了你的崩溃。因此,摆脱这种情况,只需使用一个通用异常
    catch(exception ex)
    ,就可以返回得到的错误消息。 以下是您可以做的:
statichttpclient=newhttpclient();
公共任务SendJsonAsync(字符串Json,字符串Route=“MyRoute”,字符串Token=“MyToken”)
{
尝试
{
client.Headers[HttpRequestHeader.ContentType]=“application/json”;
client.Headers[HttpRequestHeader.Authorization]=“Token Token=“+Token;
string response=wait client.UploadStringAsync(路由“POST”,Json);
返回响应;
}
捕获(例外情况除外)
{
var响应=例如消息;
返回响应;
}
} 

空引用异常可能来自异常处理程序;我不知道。分而治之,你应该能够很容易地找到它。此外,您可能应该编辑您的文章,使其不包含代码两次。谢谢您的回答。即使没有try-catch,我也尝试了该方法,结果是一样的:通过调试器部署应用程序效果很好,但当导出APK方法不起作用时,我的应用程序会崩溃并出现错误(如问题的beggin所述)。发布我的代码是为了了解我想做什么。对不起,我的英语不好。欢迎来到SO!您可以尝试使用
async/await
方法使用
WebClient
。然后检查是否可以收到响应。感谢您的回答。我试过这个方法,当然效果很好,我会把它放在我的项目中,非常感谢你的想法。但是,问题仍然存在。在做了一些测试之后,我发现:当项目编译部分的“优化代码”被启用时,我的应用程序崩溃了。所以,我残疾了,它就像一个符咒。有点奇怪,因为从来没有看到过。空引用异常可能来自您的异常处理程序;我不知道。分而治之,你应该能够很容易地找到它。此外,您可能应该编辑您的文章,使其不包含代码两次。谢谢您的回答。即使没有try-catch,我也尝试了这个方法,结果是一样的:通过调试器部署应用程序效果很好,但是
var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
static HttpClient client = new HttpClient();
public Task<string> SendJsonAsync(string Json, string Route = "MyRoute", string Token = "MyToken")
{
     try
     {
         client.Headers[HttpRequestHeader.ContentType] = "application/json";
         client.Headers[HttpRequestHeader.Authorization] = "Token token=" + Token;

         string response = await client.UploadStringAsync(Route, "POST", Json);
         return response;
     }
     catch (Exception ex)
     {
          var response = ex.Message;
          return response;
     }
}