java - HashMap 填充了 String,而其他 HashMap 未填充

标签 java android json hashmap

所以我正在尝试填充 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没有任何问题。自从我使用 AsyncTask 以来已经有一段时间了,但如果我没记错的话,你得到空 HashMap 的原因是因为当你的 getEvents 方法中的 return events; 行被调用时,你的 asynctask 尚未完成(尚未调用 onPostExcecute )。因此,getEvents 方法将返回新的 HashMap 事件,而不是填充的 HashMap。

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

在尝试访问事件 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。

关于java - HashMap 填充了 String,而其他 HashMap 未填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32025287/

相关文章:

java - 通过索引引用另一个数组

java - 通过 URLClassloader 加载加密的 Jar 文件

android - 从 Textview 获取值(value)

iOS : Message = "An error has occurred." in JSON POST

javascript - 将 Canvas 数据导出到 json

java - CompletableFuture 包装器

java - Eclipse 中的 Unicode 字符

java - 当我将 MainActivity 分成几个类时 Android 应用程序崩溃

android - 彩信发送/接收日期始终为 1970 年

php - JSON Android PHP 如何纠正错误或如何显示数据