2016-07-26 1 views
0

У меня есть этот класс, где он обрабатывает XML и хранит его внутри ArrayList<FeedItem>. Я могу отобразить содержимое массива в методе, где храню данные, но когда я пытаюсь отобразить массив в другом методе, он не прошел проверку if, указав, что ArrayList пуст. Из-за этого я не могу создать ListView, потому что он вернет ту же ошибку. Надеюсь, кто-то может кратко объяснить мне, что не так.ArrayList не отображает значение вне метода, где происходит сохранение данных

ReadRSS.java

public class ReadRSS extends AsyncTask<Void, Void, Void> { 

//Initialize progress dialog 
Context context; 
String address; 
ProgressDialog progressDialog; 
XmlPullParserFactory xmlPullParserFactory; 
volatile boolean parsingComplete = true; 
ArrayList<FeedItem> feedItems; 
ListView listView; 

public ReadRSS(Context context, ListView listView, String retrieveAddress) { 
    //Create a new progress dialog 
    this.listView = listView; 
    this.address = retrieveAddress; 
    this.context = context; 
    progressDialog = new ProgressDialog(context); 
    progressDialog.setMessage("Loading...."); 

} 

// Runs in UI before background thread is called 
@Override 
protected void onPreExecute() { 
    //Display progress dialog 
    progressDialog.show(); 
    super.onPreExecute(); 
} 

// This is run in a background thread 
@Override 
protected Void doInBackground(Void... voids) { 
    fetchXML(); 
    return null; 
} 

// This is called from background thread but runs in UI 
@Override 
protected void onProgressUpdate(Void... values) { 
    super.onProgressUpdate(values); 
} 

// This runs in UI when background thread finishes 
@Override 
protected void onPostExecute(Void aVoid) { 
    //Dismiss progress dialog 
    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); 


    /*if(listView != null) { 
    CustomAdapter customAdapter = new CustomAdapter(context, R.layout.activity_listview, feedItems); 
    listView.setAdapter(customAdapter); 

    }*/ 

    if(feedItems != null){ 
    //Gives error 
     for(int i = 0; i < feedItems.size(); i++) { 
      Log.d("Title", feedItems.get(i).getTitle()); 
      Log.d("Date", feedItems.get(i).getPubDate()); 
     } 

    } 

} 

//New Build 

public void parseXMLAndStoreIt(XmlPullParser myParser) { 
    int event; 
    String text; 
    String title = null; 
    String date = null; 

    feedItems = new ArrayList<FeedItem>(); 

    try { 
     event = myParser.getEventType(); 

     while (event != XmlPullParser.END_DOCUMENT) { 
      String tagName = myParser.getName(); 

      switch (event){ 

       case XmlPullParser.START_TAG: 
        if(tagName.equalsIgnoreCase("item")){ 
         int eventChild = myParser.next(); 
         //int innerLoop = 1; 

         String tagNameChild = ""; 
          while(eventChild != XmlPullParser.END_DOCUMENT){ 

           if(eventChild == XmlPullParser.START_TAG){ 
            tagNameChild = myParser.getName(); 
            // Output Test 
            //Log.d("Tag ", tagNameChild); 
           } 

           else if (eventChild == XmlPullParser.TEXT){ 

            text = myParser.getText(); 
            // Output Test 
            //Log.d("Test ", text); 


            if(tagNameChild.equalsIgnoreCase("title")){ 

             title = text; 
             // Output Test 
             //Log.d("Title ", myParser.getText()); 
            } 
            else if(tagNameChild.equalsIgnoreCase("pubDate")){ 

             date = text; 
             // Output Test 
             //Log.d("PubDate ", myParser.getText()); 

            } 
           } 

           else if (eventChild == XmlPullParser.END_TAG){ 


            if(myParser.getName().equalsIgnoreCase("item")){ 

             feedItems.add(new FeedItem(title,date)); 
             // Output Test 
             //Log.d("Test ", title); 
            } 

            tagNameChild = ""; 

           } 

           eventChild = myParser.next(); 

          //innerLoop++; 
          } 

         //Output Test 
         /*for(int i = 0; i < feedItems.size(); i++) { 
          Log.d("Title", feedItems.get(i).getTitle()); 
          Log.d("Date", feedItems.get(i).getPubDate()); 
         }*/ 
        } 

        break; 

       case XmlPullParser.TEXT: 
        break; 

       case XmlPullParser.END_TAG: 
        break; 

      } 

      event = myParser.next(); 

     } 

     parsingComplete = false; 
    } 

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

public void fetchXML(){ 
    Thread thread = new Thread(new Runnable(){ 
     @Override 
     public void run() { 

      try { 
       URL url = new URL(address); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

       conn.setReadTimeout(10000); 
       conn.setConnectTimeout(15000); 
       conn.setRequestMethod("GET"); 
       conn.setDoInput(true); 

       // Starts the query 
       conn.connect(); 
       InputStream stream = conn.getInputStream(); 

       xmlPullParserFactory = XmlPullParserFactory.newInstance(); 
       XmlPullParser myparser = xmlPullParserFactory.newPullParser(); 

       myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
       myparser.setInput(stream, null); 

       parseXMLAndStoreIt(myparser); 
       stream.close(); 
      } 

      catch (Exception e) { 
      } 
     } 
    }); 
    thread.start(); 
} 
} 

ответ

5

Вы звоните fetchXML() из doInBackground, но fetchXML() начинает новый поток, а затем сразу же возвращается. Затем doInBackground() сразу возвращается и вызывается onPostExecute(). Однако в этот момент нить, начатая fetchXML(), не успела закончить, поэтому feedItems не был установлен правильно.

Это неправильный способ использования AsyncTask. Вместо этого вы должны сделать выборку непосредственно в потоке doInBackground(). Просто перепишите fetchXML(), чтобы сделать выборку, а не запускать отдельный поток, чтобы сделать выборку.

+0

Спасибо! Теперь работает. Хороший день: D –