2017-07-05 3 views
0

GoogleからRSSファイルを読み込んで、見出しをリストビューに表示する基本的なアプリを作っています。私が抱えている問題は、IntentServiceで使用している静的ArrayListは、サービスのインテントを開始した後にアクセスすると空になることです。非常に基本的なものがあるかもしれませんが、私はここで紛失しています。私はどこかに過負荷があるかどうかを調べるためにコメントアウトしてみましたが、何も変わっていないと思いました。私のMainActivityからアクセスすると、サービスの静的ArrayListが空になる

ここに私のrelaventコードです、私がアクセスしようとしているArrayListはRSSsearcherのnewsList変数です。過去に私はarraylistの文字列値をログに記録し、それがRSSsearcherクラスに設定されていることを確認しましたが、MainActivityクラスでは空です。

関連するコード:

RSSsearcher:

public class RSSsearcher extends IntentService { 
    public static ArrayList<NewsCard> newsList = new ArrayList<>(); 
    private static String TAG = "RSS"; 

    public RSSsearcher() { 
     super("RSSsearcher"); 
    } 

    @Override 
    protected void onHandleIntent(@Nullable Intent intent) { 
     parseNewsLists(); 
     Log.i(TAG,"newsList in onHandleIntent" + newsList); 
    } 

    public static ArrayList<NewsCard> getNewsCards() { 
     return newsList; 
    } 

    //helper method to create all the RSSfeed objects 
    private void parseNewsLists() { 
     Log.i(TAG, "the service has been started"); 
     //Creating the RSS feed objects 
     RSSfeed topStories = new RSSfeed("https://news.google.com/news?cf=all&hl=en&pz=1&ned=us&output=rss"); 
     RSSfeed worldNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/WORLD?ned=us&hl=en"); 
     RSSfeed usNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/NATION?ned=us&hl=en"); 
     RSSfeed buisnessNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/BUSINESS?ned=us&hl=en"); 
     RSSfeed technologyNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/TECHNOLOGY?ned=us&hl=en"); 
     RSSfeed entertainmentNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/ENTERTAINMENT?ned=us&hl=en"); 
     RSSfeed sportsNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/SPORTS?ned=us&hl=en"); 
     RSSfeed scienceNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/SCIENCE?ned=us&hl=en"); 
     RSSfeed healthNews = new RSSfeed("https://news.google.com/news/rss/headlines/section/topic/HEALTH?ned=us&hl=en"); 

     try { 
      //getting RSS feeds 
      topStories.FileReader(); 
      worldNews.FileReader(); 
      usNews.FileReader(); 
      buisnessNews.FileReader(); 
      technologyNews.FileReader(); 
      entertainmentNews.FileReader(); 
      sportsNews.FileReader(); 
      scienceNews.FileReader(); 
      healthNews.FileReader(); 
     } catch (Exception e) { 
      Log.i(TAG, Log.getStackTraceString(e)); 
     } 
     //adding stories to main 
     newsList.addAll(topStories.getNews()); 
     newsList.addAll(worldNews.getNews()); 
     newsList.addAll(usNews.getNews()); 
     newsList.addAll(buisnessNews.getNews()); 
     newsList.addAll(technologyNews.getNews()); 
     newsList.addAll(entertainmentNews.getNews()); 
     newsList.addAll(sportsNews.getNews()); 
     newsList.addAll(scienceNews.getNews()); 
     newsList.addAll(healthNews.getNews()); 
    } 

} 

MainActivity:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //TODO remove and have actual tags show up 
     TagCard onecard = new TagCard("TestCard"); 
     TagCard twocard = new TagCard("TestCard2"); 

     dummyTags.add(onecard); 
     dummyTags.add(twocard); 

     mainListView = (ListView) findViewById(R.id.main_content_list); 
     drawerLayout = (DrawerLayout) findViewById(R.id.main_layout); 
     tagDrawerList = (ListView) findViewById(R.id.tag_drawer); 

     //setting an intent for the RSSsearcher to fetch the news 
     //TODO make this happen every 15 minutes or so 
     Intent intent = new Intent(this, RSSsearcher.class); 
     startService(intent); 

     NewsCard card = new NewsCard("Testing", "linkeroni"); 

     //adding all the NewsCard objects to this classes newsList 
     newsList.addAll(RSSsearcher.getNewsCards()); 

     MainAdapter adapter = new MainAdapter(this, newsList); 
     mainListView.setAdapter(adapter); 

     Log.i(TAG, "This is the array from main activity" + newsList.toString()); 

     actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.open_drawer, R.string.close_drawer){ 

      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       getActionBar().setTitle("Closed"); 
      } 

      public void onDrawerOpened(View view){ 
       super.onDrawerOpened(view); 
       getActionBar().setTitle("Open"); 
      } 
     }; 

     //TODO removed dummytags and add actual tag implementation 
     tagDrawerList.setAdapter(new TagAdapter(this,dummyTags)); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 

    } 

は、事前にありがとうございます!

+0

にまだあると思いますRSSsearcher.getNewsCards()); '。これでデータにアクセスすることは、本当に良い考えではありませんでした。 – tyczj

+0

'buisnessNews'のスペルが間違っています。 –

+0

Tyczj、私はサービスでそれを望んでいた理由は、バックグラウンドで1時間ごとにRSSフィードを継続的に取得したいからです。私はまだその部分を追加していません。それを行うより良い方法はありますか?ルー・ブロッホ、そうです。編集私は入力を完了しませんでした。 –

答えて

0

私はあなたが

newsList.addAll(RSSsearcher.getNewsCards()); 

を呼び出すとき意図は、あなたの意図サービスが、それはあなたがこの `newsList.addAllを(行う時までにすべてを持っているという意味ではありません開始からといって、実行

+0

実行を完了するか、別のタスクでやるのを待つことができますか?私がAsyncTaskでそれをしたら、別のスレッドの右から同じ問題が残る可能性がありますか? –

関連する問題