java - 使用 AsyncTask 时应该如何处理 HTTP 响应码?

标签 java android android-asynctask

我正在创建一个 android 应用程序,它接受用户输入,尝试使用指定的输入连接到 API url 并检索数据并显示它。现在我已经能够执行上述所有操作,但如果用户输入的内容不存在,我的应用程序可能会因 NPE(空指针异常)而崩溃。

我使用的 API 向我显示了可能发生的响应错误列表,但我不确定我应该如何处理或实现将这些响应错误考虑在内的功能。

目前,我的扩展AsyncTask 类具有这些参数:String、Void、JSONObject,以下代码是我在doInBackground 方法中的内容.

URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();

int statusCode = urlConnection.getResponseCode();
switch (statusCode) {
    case 400:
    return "Error 400 - Bad request.";
    case 401:
    return "Error 401 - Unauthorized request.";
}

我无法返回字符串,因为我的 AsyncTask 参数返回一个 JSONObject。我可以更改它,使其返回一个字符串,但我认为这不是处理响应错误的正确逻辑方式。

现在,如果 API 响应代码是 404(未找到数据),我不希望应用程序崩溃,因为它无法返回 JSONObject,相反我希望它继续到下一个 fragment 并显示最少的信息。

那么当我的方法返回 JSONObject 时,我该如何处理响应错误呢?

最佳答案

你有几个选择(我说#1 是你最好的选择)

1) 创建一个自定义的JSON对象,将statuscode从后台部分传送到UI(或其他调用线程)。然后只需检查从 asynctask 返回的 JSON 是否是“HTTP 结果 JSON”之一,而不是正常结果。 (基本上将您的“异常”/等从后台处理包装在 JSON 中,并使用 JSON 传输您的返回消息以在任何一种情况下进行处理。)

2) 你可以抛出异常(但我个人认为这是糟糕的设计,捕获异常然后在 onPostExecute() 中处理它们通常更好(通过像 #1 这样的标志)

3) 你可以在 asyncTask 之外的某处设置一个标志来说明返回码是什么(但这通常不是线程安全的。这意味着如果你的用户导致两个任务同时运行并且它们返回时可能会很麻烦不同的顺序(或同时),您可能无法获得每个返回的“正确”值(value)。)

4) 你可以像https://stackoverflow.com/a/6312491/5673694那样做说要做。但是有 1 个坏问题和 1 个“嗯”问题......

坏问题:她的实现有内存泄漏问题。 Java 中的内部类在实例化时具有对其外部类实例的继承引用。这意味着如果您的异步任务仍在运行,如果您出于某种原因退出您的应用程序/打来电话/等等,您的父类/(最有可能的 Activity )将无法被垃圾收集...因此,您的应用程序可能会在很长一段时间内不应该占用系统内存。 (无论你的 asyncTask 运行多长时间(无限可能))要解决此问题,请将内部类设为静态,并对类实例使用 Wea​​kRefernce<>。 (这应该适用于 Android 中所有处理后台任务的内部类,例如 Handlers 等)这个内存泄漏问题没有很好的记录,但存在并且我们在 MOOC 中讨论它,我的博士导师是导师和我是职员https://www.coursera.org/course/posacommunication

'ehh' 问题(这更像是一个'被警告'的问题)......你可以让 AsyncTask 存储异常,但是如果你将它设为静态,这有可能导致问题您的 AsyncTask 类(Java 中的静态和泛型与 C++ 中的工作方式不同,在 C++ 中,模板类的每个变体都有不同的类实现,但在 Java 中只有 1 个类文件,因此静态是在所有不同版本之间“共享”。)(注意:上面说的是“静态类”,这里我说的是“该类中的静态变量”)

关于java - 使用 AsyncTask 时应该如何处理 HTTP 响应码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278067/

相关文章:

android - Google Play 内部应用共享不再适用于任何设备

android - 将 Android 动画置于其结束状态

android - 非法状态异常 : Content has been consumed (on first getContent())

android - CursorLoader 和 AsyncTaskLoader 的区别

java - hadoop mapreduce异常时如何将任务状态更改为失败

java - CF推送-系统找不到指定的文件

java - 什么时候调用枚举构造函数?

android - 无法在内部存储中找到保存到文本文件的数据,如何将文件保存在内部存储 android studio 中?

android - 带有大图像的 ListView 非常慢

java - 数组比 ArrayLists 更有效?