C# 方法在通过调试器部署时正常工作,但在导出APK时相同的方法不工作
我在部署Xamarin.Android中生成的APK(来自我设备的Logcat)时遇到这个错误 但是,此错误仅在安装应用程序并从导出的APK执行时发生。当我使用VisualStudio调试器时,该方法运行良好 我试图将该方法放在一个独立的类中或活动中(甚至将该方法的一部分放在onCreate()方法中),更改访问级别,但没有任何效果 编辑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,您得到错误是因为
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;
}
}