我编写的 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 块(之后的 4 行)时,该异常似乎没有在 Eclipse 中实例化。
正如我所提到的,我在安卓模拟器中没有这个问题,只有在我的手机上测试时。此外,该问题仅在设备本身 4 次中出现约 3 次,因此不会始终如一地发生。
仅供参考,这一切都发生在 AsyncTask 中,因此在 UI 线程上进行 Async 网络调用应该没有问题。
我是 Android 新手,实际上是 Java 和 Eclipse 新手,所以我很容易忽略一些简单的事情。
关于正在发生的事情或为什么我的异常在 catch 块中不可用的任何想法?