【问题标题】:HashMap filled with String and other HashMap doesn't get populated用字符串填充的 HashMap 和其他 HashMap 不会被填充
【发布时间】:2023-03-16 15:39:01
【问题描述】:

所以我正在尝试填充 HashMap> 但是当我调试时,我看到我的 HashMap “gegevens” 填充没有问题,但我的主要 HashMap “events” 没有。我正在用 JSON 数据填充我的 HashMap,但这根据调试器工作。只有我的事件 HashMap 保持为空。这是我使用的方法:

private HashMap<String,HashMap<String,String>> events = new HashMap<String,HashMap<String,String>>();

public class ReadJSONFeedTask extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... urls){
        return readJSONFeed(urls[0]);
    }
    protected void onPostExecute(String result){
        try{

            JSONObject object = new JSONObject(result);
            String channel = object.getString("channel");
            JSONObject object2 = new JSONObject(channel);
            JSONArray item = object2.getJSONArray("item");
            for(int i = 0; i < item.length();i++)
            {
                HashMap<String,String> gegevens = new HashMap<String,String>();

                JSONObject object3 = item.getJSONObject(i);

                JSONObject objTitle = object3.getJSONObject("title");
                String title = objTitle.getString("@text");

                JSONObject objLink = object3.getJSONObject("link");
                String link = objLink.getString("@text");

                JSONObject objDescription = object3.getJSONObject("description");
                String description = objDescription.getString("@text");

                JSONObject objPubDate = object3.getJSONObject("pubDate");
                String pubDate = objPubDate.getString("@text");

                JSONObject objCreator = object3.getJSONObject("http://purl.org/dc/elements/1.1/creator");
                String creator = objCreator.getString("@text");

                JSONObject objGuid = object3.getJSONObject("guid");
                String guid = objGuid.getString("@text");

                gegevens.put("link",link);
                gegevens.put("description",description);
                gegevens.put("pubDate",pubDate);
                gegevens.put("creator",creator);
                gegevens.put("guid",guid);

                events.put(title,gegevens);


            }



        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

我看不出我做错了什么,但我很新,这是我第一次在 HashMap 中使用 HashMap,所以我认为我的错误很可能就在那儿。我必须能够在另一个类中使用事件 HashMap。

这段代码在我更大的 MainActivity.Java 类中。我正在尝试将我的事件 HashMap 传递给另一个框架。我通过创建一个 getter 来做到这一点,我首先让它执行 ReadJSONFeedTask(),然后像这样返回事件 HashMap:

public HashMap<String,HashMap<String,String>> getEvents()
    {
        new ReadJSONFeedTask().execute("http://data.kortrijk.be/nieuws/rss.json?%2Fkortrijk%2F%2Fnieuws%2Frss=");
        return events;
    }

在我的 HomeFragment.java 中,我试图像这样访问 OnCreateView 中的 HashMap:

package com.example.arno.eventaris.Fragment;


import android.app.DialogFragment;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;



import com.example.arno.eventaris.Activity.JSONActivity;
import com.example.arno.eventaris.Activity.MainActivity;
import com.example.arno.eventaris.Error.ErrorJason;
import com.example.arno.eventaris.R;

import java.util.HashMap;


/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends Fragment {


    public HomeFragment() {
        // Required empty public constructor
    }




    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        //((MainActivity)getActivity()).ExecuteJson();
        HashMap events =((MainActivity)getActivity()).getEvents();
        return inflater.inflate(R.layout.fragment_home, container, false);



    }


}

【问题讨论】:

  • 一般来说,将一个hashmap作为另一个hashmap的值是没有问题的。你的问题必须在其他地方。您是否看到任何打印到控制台的异常?
  • 不,我唯一看到的是事件 HashMap 的长度在循环期间保持为 0,而当循环重新开始时,事件变量再次消失。
  • 是否有可能我的事件确实被数据填充但在循环重新开始后立即清空?
  • 您的events 变量在哪里准确定义?在您的代码示例中,它位于类之上(不可能)。是否在类中定义为成员变量?
  • 这只是我的一段代码,所有这些都发生在我更大的 MainActivity.Java 类中。我在 MainAcitivity 中声明了它,以便我可以在不同的方法中使用它。

标签: java android json hashmap


【解决方案1】:

您的 HashMap 没有任何问题。自从我使用 AsyncTask 已经有一段时间了,但如果我没记错的话,你得到一个空 HashMap 的原因是因为当你的 getEvents 方法中的 return events; 行被调用时,你的 asynctask 还没有完成(onPostExcecuteis尚未调用)。所以getEvents 方法将返回新的 HashMap events 而不是填充的 HashMap。

这就是您使用 AsyncTask 的原因:防止程序等待必须运行的任何代码。

在尝试访问 events HashMap 之前,您必须告诉您的 MainActivity 异步任务何时完成。

例如,您可以执行以下操作:

public void getEvents()
    {
        new ReadJSONFeedTask().execute("http://data.kortrijk.be/nieuws/rss.json?%2Fkortrijk%2F%2Fnieuws%2Frss=");
    }

然后在 onPostExcecute 结束时

MainActivity.this.doSomethingWithEvents();

并在 MainActivty 中创建一个doSomethingWithEvents() 方法,您可以在其中使用(现在填充的)事件 HashMap。

【讨论】:

    【解决方案2】:

    我用以下字符串尝试了你的代码

    "{"channel":{"item":[{"title":{"@text":"testTitle"},"link":{"@text":"testlink"},"description":{"@text":"testdescription"},"pubDate":{"@text":"testPubDate"},"http://purl.org/dc/elements/1.1/creator":{"@text":"testCreator"},"guid":{"@text":"testguid"}}]}}" 它似乎正在工作。

    但是你说你想在另一个类中使用事件 HashMap,你如何将事件 HashMap 传递给另一个类。能否提供更多信息。

    【讨论】:

    • @HeadachePanda 所以在你的getevents中你调用了一个异步任务然后返回你的hashmap,这意味着在创建一个新线程之后你只是继续流程,这就是为什么你的HashMap没有得到理想的填充应该在 AsyncTask 的 onPostExecuteMethod 中返回您的地图,并且必须让进程等待,否则使用某些接口创建回调机制。
    • 似乎不可能在 onPostExecute 方法中返回一些东西。它说:“无法执行重构,文件 c/users/...../AsyncTask.class 位于 jar 文件中。”
    • 好吧,我可能不得不在您的上下文中尝试,但其他替代方法是在您的主要活动中调用一个方法,该方法可以在您处理完 JSON 后向您的片段类发送回调。或者如果这个异步任务只限于片段,那么从你的片段而不是你的活动中执行异步任务怎么样
    • 确实是因为异步任务@ThomasS 向我解释了如何正确解决它。感谢您的帮助。
    猜你喜欢
    • 2013-12-19
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2016-08-02
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多