JSON不适用于Android Lollipop

时间:2014-12-10 07:43:46

标签: android json android-asynctask android-5.0-lollipop jsonobject

在我的项目中,我创建了一个列表视图,其中包含JSON显示的数据(通过BaseAdapter)。 在初始化适配器时,我初始化包含JSON调用的AsyncTask,并显示进度对话框。

在所有Android版本中一切正常,但在android棒棒糖中加载只是没有停止。

private class NewsJsonAsync extends AsyncTask<Void, Void, Boolean> {

    private String mURLString = "http://json.com/json.json";
    private ProgressDialog mProgressDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        mProgressDialog = new ProgressDialog(mContext);
        mProgressDialog.setMessage(mContext.getString(R.string.dialog_loading_title));
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();

    }

    @Override
    protected Boolean doInBackground(Void... params) {

        Log.d("DO IN BACKGROUND", "BEFORE TRY/CATCH");
        try {
            String stream = streamManager();
            jsonManager(stream);

        } catch (JSONException e) {
            e.printStackTrace();
            Log.d("JSON EXCEPTION HERE", e.getLocalizedMessage());
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("IO EXCEPTION HERE", e.getLocalizedMessage());
            return false;
        }
        Log.d("DO IN BACKGROUND", "AFTER TRY/CATCH");
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (result == true) {
            notifyDataSetChanged();
            mProgressDialog.dismiss();
        } else {
            mProgressDialog.dismiss();
        }
    }

    private String streamManager() throws IOException {
        URL url = new URL(mURLString);
        InputStream stream = url.openStream(); //open the data stream
        byte[] bytes = new byte[stream.available()];

        String getBytes = ""; //holds the data recived for the server in their raw form
        int countBytes; //indicator for the amount of bytes left

        while ((countBytes = stream.read(bytes)) > -1 ) { //while the stream size is more then -1 (while there is still data)
            getBytes += new String(bytes,0,countBytes); //add the data to the string

        }
        stream.close();
        return getBytes;
    }


    protected void jsonManager (String data) throws JSONException {
        JSONArray jsonArray = new JSONArray(data); //call the JSON GENERAL array

        String title = "";
        String subtitle = "";

        int size = jsonArray.length();

        for (int i = 0; i < size; i++) {

            JSONObject jsonArticle = jsonArray.getJSONObject(i);
            title = jsonArticle.getString(Enums.JSON_TITLE.getValue());
            subtitle = jsonArticle.getString(Enums.JSON_SUBTITLE.getValue());


            mArray.add(new NewsListWithDB(title, subtitle)));
        }

我停止获取任何日志&#34;在尝试/捕获之前&#34;。 在Log-cat之后我认为它可能与我反复发送的一条消息有关

12-10 09:38:38.991: I/art(23270): Background sticky concurrent mark sweep GC freed 263748(8MB) AllocSpace objects, 0(0B) LOS objects, 33% free, 10MB/16MB, paused 1.617ms total 107.675ms

可能是ART是问题的根源吗?我该怎么办?

2 个答案:

答案 0 :(得分:2)

好的,所以在寻找答案之后,似乎问题不在于我的代码,问题在于android 5.

我尝试了很多JsonArray / JsonObject教程,下载了他们的样本等,但没有任何效果。此外,我目睹了越来越多的开发人员遭遇同样的问题。

感谢Lena的建议我再次尝试了GSON,这次它起作用了。上次我厌倦了使用GSON问题是我执行不力。

谢谢大家。

答案 1 :(得分:1)

所以我遇到了类似的问题。我的应用程序将json对象存储到对象数据库neodatis。最近,似乎将应用程序升级到棒棒糖会导致各种崩溃。

从日志中,看起来他们将JSONObject的内部数据结构从HashMap更改为LinkedHashMap。如果您在棒棒糖前保存了数据,则一旦手机升级到棒棒糖,就会出现问题。