-1

我有以下 JSON 解析器的代码。其实不是我自己写的,是从各种stackoverflow问题中收集的。但不知何故,它不起作用。我允许使用互联网:

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    String url=null;
    // constructor
    public JSONParser() {

    }

    // function get JSON from URL
    public JSONObject makeHttpRequest(String url) {
        BackGroundTask Task= new BackGroundTask(url);
        try {
            return Task.execute().get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
    public class BackGroundTask extends AsyncTask<String, String, JSONObject>{
        String URL=null;
        public BackGroundTask(String url) {
            URL = url;
        }
        @Override
        protected JSONObject doInBackground(String... params) {
            // TODO Auto-generated method stub

            // Making HTTP request
            try {
                // Making HTTP request 

                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();       

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {

                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        is, "iso-8859-1"), 8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // return JSON String
            return jObj;

        }
    }
}

编辑:

您能看到任何可能导致此类失败的问题部分吗?我调试了我的代码,发现在这行之后

JSONParser jParser = new JSONParser();
JSONObject json = jParser.makeHttpRequest(URL);

json对象是null

4

1 回答 1

0

AsyncTasks 并不真正适合 Android 上的网络。正如文档所说:它们是为“短期任务”而设计的。而网络不属于这一类。此外,使用异步任务会导致一些关于活动生命周期的重要问题。要确信,只需旋转您的设备,您就会看到您的网络请求无法更新您的 UI。

我建议你看看RoboSpice,这个库在网络方面更有趣。此外,spring android 模块将让您非常轻松地解析 json。

顺便说一句,我是 RS 的作者之一......

于 2013-05-07T13:50:52.990 回答