尝试与共享首选项之间加载数据时,应用程序崩溃

时间:2018-11-19 04:48:57

标签: android notifications crash

在我的应用程序中,我正在处理通知发布事件并过滤通知,然后将其保存在对象模型的共享首选项中,并使用哈希表:

  Map<String,  List<Model>> 

我正在使用asynctask从共享首选项中获取应用中的列表:

    private class FetchData extends AsyncTask<Void,Void,Map<String,List<Model>>> {

    @Override
    protected Map<String, List<Model>> doInBackground(Void... voids) {
        SharedPreferences shared;
        Gson gson = new Gson();
        shared = getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
        modelList = gson.fromJson(
                shared.getString("My_map", null),
                new TypeToken<HashMap<String, List<Model>>>() {
                }.getType());
        return modelList;
    }

    @Override
    protected void onPostExecute(Map<String, List<Model>> stringListMap) {
        super.onPostExecute(stringListMap);
        if(modelList!=null) {
            keys = getKeys(modelList);
            adapter = new CustomListAdapter(getApplicationContext(), keys);
            list.setAdapter(adapter);
        }
    }
}

数据保存在此功能中:

     private void saveMap(Map<String,List<Model>> inputMap){
    SharedPreferences shared;
    SharedPreferences.Editor editor;

    shared = getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
    editor = shared.edit();

    Gson gson = new Gson();
    String json = gson.toJson(inputMap);
    editor.putString("My_map", json);
    editor.commit();
}

每当发布新通知时,我都会从中提取数据并将其保存在本地哈希图中,也保存到共享的首选项中。在打开应用程序时,我将数据从共享首选项加载到本地列表中。

我不明白的是,每当发布新通知时,我的应用中出现anr的原因。

It has been 8006.8ms since event, 8006.4ms since wait started.  Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 2.  Wait queue head age: 9112.1ms.

 Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 2.  Wait queue head age: 9112.1ms.

1 个答案:

答案 0 :(得分:2)

美好的一天! 首先,您应该将对saveMap()函数的调用移至后台线程。例如在doInBackground()内部。

我还建议您考虑使用数据库存储通知-太复杂了,无法存储在“共享首选项”中。