Используйте один экземпляр класса в нескольких фрагментах - PullRequest
0 голосов
/ 25 апреля 2019

Каков наилучший способ использовать один экземпляр класса в нескольких фрагментах?(или просто метод)

В моем приложении у меня есть класс RangeFetcher, который загружает XML-файл и анализирует его в классе модели Item.RangeFetcher содержит ArrayList<Item> items, содержащий весь XML-файл, проанализированный в экземплярах модели.

Я создаю фрагмент ShopFragment из моей начальной деятельности ShopMainViewScreen.В этом фрагменте я создаю RangeFetcher.Поскольку это довольно дорогая операция с точки зрения объема данных и вычислений, я бы хотел передать этот экземпляр RangeFetcher трем другим имеющимся у меня фрагментам.

Этот метод getItems в основном все что мне нужно во фрагментах.

public class RangeFetcher extends AsyncTask {

  ArrayList <Item> items = new ArrayList();

  //filling the List...

  public ArrayList <Item> getItems() {
    return items;
  }
}

То, что я учел до сих пор:

  • Я думал об использовании пакета и передаче ArrayList в аргументах для передачи экземпляра из одного фрагмента в другой,но это кажется немного неуклюжим.Может ли это вызвать проблемы с обратным стеком?
  • делает метод getItems статическим?Я думаю, что это было бы осуществимо, поскольку RangeFetcher всегда будет давать одинаковый результат для всех фрагментов.(я что-то здесь упускаю?)
  • Есть ли у вас какие-либо другие предложения о том, как получить доступ к этому экземпляру из нескольких фрагментов?

RangeFetcher Класс

    package com.XXX;

    import android.os.AsyncTask;

    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlPullParserFactory;

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;

    //I know using a switch statement would probably be more fitting here.
    //Furthermore I didn't know how to wait for the background task to
    //finish so i just introduced a boolean "processing". When this boolean
    //is set to false, i continue with my tasks on the fragments.
    //So feel free to suggest some improvements to my code ^^
    public class RangeFetcher extends AsyncTask {

     URL url;
     ArrayList < Item > items = new ArrayList();
     boolean processing = false;
     Item i;

     protected Object doInBackground(Object[] objects) {
      processing = true;

      try {
       url = new URL("XXXX");

       XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
       factory.setNamespaceAware(false);
       XmlPullParser xpp = factory.newPullParser();

       xpp.setInput(getInputStream(url), "UTF_8");


       boolean insideItem = false;
       boolean priceSet = false;

       int eventType = xpp.getEventType();
       while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {

         if (xpp.getName().equalsIgnoreCase("item")) {
          insideItem = true;
          i = new Item();

         } else if (xpp.getName().equalsIgnoreCase("g:id")) {
          if (insideItem)
           i.setmID(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("title")) {
          if (insideItem)
           i.setmTitle(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("description")) {
          if (insideItem)
           i.setmDescription(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:product_type")) {
          if (insideItem) {
           String fullCategory = xpp.nextText();
           if (fullCategory.contains(" ")) {
            fullCategory = fullCategory.substring(0, fullCategory.indexOf(" "));
           }
           i.setmProductType(fullCategory);
          }
         } else if (xpp.getName().equalsIgnoreCase("g:image_link")) {
          if (insideItem)
           i.setmPictureLink(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:condition")) {
          if (insideItem)
           i.setmCondition(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:availability")) {
          if (insideItem)
           i.setmAvailability(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:price") && priceSet == false) {
          if (insideItem)
           i.setmPrice(xpp.nextText());
          priceSet = true;
         } else if (xpp.getName().equalsIgnoreCase("g:brand")) {
          if (insideItem)
           i.setmBrand(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:mpn")) {
          if (insideItem)
           i.setmMpn(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:country")) {
          if (insideItem)
           i.setmShippingCountry(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:service")) {
          if (insideItem)
           i.setmService(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:price")) {
          if (insideItem)
           i.setmShippingCosts(xpp.nextText());
         } else if (xpp.getName().equalsIgnoreCase("g:pubDate")) {
          if (insideItem)
           i.setMpubDate(xpp.nextText());
         }

        } else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")) {
         insideItem = false;
         items.add(i);
         priceSet = false;
        }
        eventType = xpp.next(); //move to next element
       }
      } catch (MalformedURLException e) {
       e.printStackTrace();
      } catch (XmlPullParserException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
      processing = false;
      return items;
     }

     private InputStream getInputStream(URL url) {
      try {
       return url.openConnection().getInputStream();
      } catch (IOException e) {
       return null;
      }
     }

     public ArrayList < Item > getItems() {
      while (processing == true) {}
      return items;
     }

     public Boolean processing() {
      return processing;
     }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...