异步JSON解析器不起作用

时间:2013-05-07 13:44:11

标签: android json parsing asynchronous

我有以下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

1 个答案:

答案 0 :(得分:0)

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

我建议你看看RoboSpice,这个库在网络方面更有趣。而且,spring android模块可以让你轻松解析json。

不过,我是RS的作者之一...