gpt4 book ai didi

java - Android JSON 转换后抛出异常(仅限设备端)

转载 作者:行者123 更新时间:2023-11-30 03:53:38 34 4
gpt4 key购买 nike

我在使用我编写的 Android 应用程序时遇到问题,但只有在我的实际手机设备上运行它时才会出现问题。它在模拟器中运行没有问题。这是发生问题的类:

public class JsonServiceHandler {
private final static String QUEUE_SERVICE_URI = "http://192.168.1.132/QueueTest/AccessService.svc/JSON";

public static <T extends QueueAccessObject> List<T> GetServiceResult(String serviceMethod, Class<T> classType, Hashtable parameters){
try
{
String url = QUEUE_SERVICE_URI + "/" + serviceMethod;

if(parameters != null && parameters.size() > 0)
{
url += "?";

Enumeration e = parameters.keys();

while(e.hasMoreElements())
{
Object key = e.nextElement();
url += key.toString() + "=" + parameters.get(key);
}
}

// Send GET request to <service>/<endpoint>
HttpGet request = new HttpGet(url);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);

HttpEntity responseEntity = response.getEntity();

// Read response data into buffer
char[] buffer = new char[(int)responseEntity.getContentLength()];
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);
reader.read(buffer);
stream.close();

JSONObject jsobj = new JSONObject(new String(buffer));
JSONObject ridesResult = jsobj.getJSONObject(serviceMethod + "Result");

List<T> array = GetObjectsFromJSONArray(ridesResult.getJSONArray("RootResults"), classType);

return array;
}
catch(Exception e){
return null;
}
}

private static <T extends QueueAccessObject> List<T> GetObjectsFromJSONArray(JSONArray jArray, Class<T> classType) {
List<T> list = new ArrayList<T>();

try
{
for(int i = 0; i < jArray.length(); ++i){
T item = classType.getConstructor(JSONObject.class).newInstance(jArray.getJSONObject(i));
list.add(item);
}
}
catch(Exception ex){}

return list;
}

}

问题发生在我获取 HttpGet 的 JSON 结果并将其复制到强类型对象数组后。

当异常被抛出时,JSON 响应看起来很好,并且强类型对象列表似乎被创建并返回得很好。它只会在调用 GetObjectsFromJSONArray List<T> array = GetObjectsFromJSONArray(... 之后 才在赋值时爆炸。 .

当它落下 catch block 时(4 行之后),异常似乎没有在 Eclipse 中实例化。

正如我提到的,我在 Android 模拟器中没有这个问题,只有在我的手机上测试时才会出现。此外,该问题仅在设备本身上发生 4 次中的 3 次,因此不会持续发生。

仅供引用,这一切都发生在 AsyncTask 中,因此在 UI 线程上执行异步网络调用应该没有问题。

我是 Android 的新手,事实上是 Java 和 Eclipse 的新手,所以我很容易忽略一些简单的事情。

关于正在发生的事情或为什么我的异常在 catch block 中不可用有任何想法吗?

最佳答案

这里抛出了一个真正的异常,我终于让它显示出来了。导致它保持未实例化的问题似乎是异常本身从未在 Catch block 中使用过(我只返回一个空值)。也许有某种针对 Android 环境的编译器优化,这样如果不使用 Exception 参数就不会创建?

当我添加实际使用异常本身而不是吞下它的代码时,我收到一个 JSONException 告诉我我的响应在中途被切断。当然,现在我必须弄清楚为什么会发生这种情况(而且只发生在设备上),但是异常实例化的问题与它因未被使用而被删除这一事实有关。

编辑:

关于 JSONException 本身的更多信息:显然,我用来将 HttpResponse 加载到 JSONObject 中的代码无效,或者至少无效:

    // Read response data into buffer
char[] buffer = new char[(int)responseEntity.getContentLength()];
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);
reader.read(buffer);
stream.close();

JSONObject jsobj = new JSONObject(new String(buffer));

我已经删除了这段代码,优先于找到的 convertStreamToString 方法的内容 here .这让我兴奋不已。

关于java - Android JSON 转换后抛出异常(仅限设备端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690114/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com