使用AsyncTask解析数据并在不同的片段中显示它

时间:2014-04-29 00:04:08

标签: android multithreading android-fragments xml-parsing android-asynctask

我正在创建一个解析URL数据的应用程序,将数据分成不同的类别,然后将数据显示在不同的ListView中。我已经成功解析了数据,但是我在显示信息方面遇到了问题。它有点复杂:我的应用程序有6个片段(使用SwipeViews),每个片段将显示一部分数据(List)。从我扩展到AsyncTask的类ParseManager,我正在做所有的事情(解析,获取列表等)。 MainActivity执行AsyncTask,我想要做的是发送我在AsyncTask中收集的数据并将其发送到不同的Fragments。问题是片段和数据之间的通信,因为片段是在onCreateView()方法中创建的,并且在创建视图后接收数据。这是完成所有工作的课程

public class ParseManager extends AsyncTask<Void,Integer,Void>{
    static ArrayList<Item> news=new ArrayList<Item>();
    static ArrayList<Item> items=new ArrayList<Item>();
    private static String FEED_URL="some url";
    public int ready=0;
    Message msg;

protected void onProgressUpdate(Integer... progress) {
  }

  protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      Log.d("TASK","TASK FINISHED....");
     return;
   }

@Override
protected Void doInBackground(Void... params){
    Log.d("TASK","TASK IS BEING PROCESSED....");
    loadXML();
    return null;
}

public void loadXML(){
    try{
        URL url=new URL(FEED_URL);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.setReadTimeout(1000);
        conn.setConnectTimeout(1500);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        InputStream stream=conn.getInputStream();
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        XmlPullParser xmlParser=factory.newPullParser();
        xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        xmlParser.setInput(stream,null);
        items=(ArrayList<Item>) XmlFeedParser.parser(xmlParser);
        stream.close();
    }catch(Exception e){
        e.printStackTrace();
        }
}
 public static List<Item> getNews(){
    if(items==null)
        return null;
    List<Item> news=new ArrayList<Item>();
    for(Item item:items){
        if("news_section".equals(item.getType()))
            news.add(item);
    }
    return news;
}// for the rest of the data, there are other methods
`

这是显示数据的片段之一

 public class HomeActivity extends Fragment{
    static ListView newsList;
    static Item item=null;//list of Item objects
        static Context context;
    static ItemAdapter itemAdapter;
    static AllItems articles=new AllItems();
        static List<Item> news=new ArrayList<Item>();
    static int i=0;

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
   super.onCreateView(inflater, container, savedInstanceState);
   //newsList=(ListView)getActivity().findViewById(R.id.news_list);
  // itemAdapter=new ItemAdapter(context,typeOfNew,(ArrayList<Item>)news);
 //  newsList.setAdapter(itemAdapter);
   return inflater.inflate(R.layout.home_activity, container,false);    
}

public static void displayNews(List<Item> news){
    try {        
         if(news==null || news.size()==0){
                //Retrieve again the data list
         }
         //Log.d("HomeActivity","total news: "+news.size());
         for(Item item:news){ //Item is the object that I'm using to create the List
             news.get(i);
             i++;
             itemAdapter.add(news.get(i));
         }
     } catch (Exception e) {
         e.printStackTrace();
     }

}   

在主Activity中我只用这一行在OnCreateView()中执行AsyncTask     parser.execute();

我已经读过我可以使用处理程序,因此数据线程可以与UI线程通信,但我迷路了。我总共有6个片段,我想要显示数据,所有片段都是从MainActivity初始化的。我添加了几个log.d来可视化应用程序的工作方式,所有片段都是在AsynTask完成数据处理。如果您需要更多信息或代码,请帮助,任何信息,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

在您的主Activity中,为每个片段创建成员变量,即

private FragmentA fragmentA;
private FragmentB fragmentB;

在Fragment类中,为数据定义一个setter:

public void setListItems(List<Item> listItems) {
    // Code for updating the Fragment UI components here
}

AsyncTask完成后,从主Activity调用

this.fragmentA.setListItems(dataForA);
this.fragmentB.setListItems(dataForB);
....

您可能需要让AsyncTask报告在onPostExecute方法中完成主活动。