1

我编写的 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 响应看起来很好,并且强类型对象列表似乎被创建并返回得很好。它只会在调用 GetObjectsFromJSONArrayList<T> array = GetObjectsFromJSONArray(...对分配造成影响。

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

正如我所提到的,我在安卓模拟器中没有这个问题,只有在我的手机上测试时。此外,该问题仅在设备本身 4 次中出现约 3 次,因此不会始终如一地发生。

仅供参考,这一切都发生在 AsyncTask 中,因此在 UI 线程上进行 Async 网络调用应该没有问题。

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

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

4

1 回答 1

1

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

当我添加实际使用异常本身而不是吞下它的代码时,我收到一个 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 方法的内容。这让我滚动。

于 2012-12-03T23:21:46.760 回答