所以我正在尝试填充 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/