2015-08-15 46 views
1

所以我想填補一個HashMap>但是當我調試我看到我的HashMap「gegevens」填補沒有問題,但我的主要HashMap的「事件」沒有按」噸。我用JSON數據填充我的HashMap,但是這根據調試器工作。這只是我的事件HashMap保持空白。這是我使用的方法: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傳遞給另一個框架。我通過使吸在這裏我先讓它執行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我試圖訪問的HashMap的OnCreateView像這樣的:

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); 



    } 


} 
+0

通常沒有問題將散列圖作爲另一個散列表的值。你的問題必須在別的地方。你是否看到任何打印到控制檯的異常? – beosign

+0

沒有我看到的唯一事情是事件HashMap在循環過程中保持爲0,並且循環開始的事件變量再次消失。 – HeadachePanda

+0

我的事件是否有可能被數據填充,但在循環開始後立即清空它本身? – HeadachePanda

回答

0

沒有什麼不對您的HashMap中。它已經有一段時間,因爲我用的AsyncTask,但如果我沒有記錯的原因,你得到一個空的HashMap是因爲當你getEvents方法行return events;就是您的AsyncTask尚未完成(在onPostExcecute尚未調用)。因此getEvents方法將返回新的HashMap 事件而不是填充的HashMap。

也就是說你使用的AsyncTask的理由:防止程序等待任何代碼都必須運行。

你必須告訴你的MainActivity時的AsyncTask完成您嘗試訪問事件的HashMap之前。在onPostExcecute

MainActivity.this.doSomethingWithEvents(); 

結束

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

然後你在哪裏使用(現在充滿)事件的HashMap創建MainActivty一個doSomethingWithEvents()方法:

例如U可以執行下列操作。

+0

感謝這工作! – HeadachePanda

0

以及我想你的代碼與以下字符串

"{"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的其他類。你能提供更多的信息嗎?

+0

我要去給我的問題添加一些代碼。 – HeadachePanda

+0

@HeadachePanda所以在你的getevents中你要調用一個異步任務,然後返回你的hashmap,這意味着創建一個新線程後,你只是繼續處理流程,這就是爲什麼你的HashMap沒有得到理想的填充,你應該返回你的地圖AsyncTask onPostExecuteMethod並且必須讓進程等待或者創建一個使用某些接口的回調機制。 – harshitpthk

+0

似乎不可能在onPostExecute方法中返回某些內容。它說:「重構不能執行,文件c/users /...../ AsyncTask.class位於jar文件中。」 – HeadachePanda