2015-04-08 1 views
0

J'utilise le menu swipe tab pour générer la vue de l'application, au démarrage, je suis en dehors de générer la mise en page pour les onglets, je cours également async task, qui est Lecteur Rss. En ce moment j'ai trois onglets, le flux Rss est sur le premier onglet. Le problème est quand je vais au troisième onglet et de nouveau au premier, le flux disparaît. Je pense que c'est parce que le async task qui récupère le flux Rss ne fonctionne que dans l'activité principale, mais quand j'essaie d'appeler cette tâche lorsque le premier onglet est rendu, je reçois null pointer exception pour text view (si aucune connexion réseau) ou listview , Je ne sais pas pourquoi cela ne pointe pas vers la mise en page correcte, des idées?Android tâche asynchrone avec affichage du contenu différent et onglets de balayage

C'est le code pour la tâche async:

public class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem>> { 

     private Activity ownerActivity; 
     private Exception exceptionToBeThrown; 

     @Override 
     protected List<RssItem> doInBackground(String... urls) { 

      // Debug the task thread name 
      Log.d("RssReader", Thread.currentThread().getName()); 

      try { 
       // Create RSS reader 
       RssReader rssReader = new RssReader(urls[0]); 

       // Parse RSS, get items 
       return rssReader.getItems(); 

      } catch (Exception e) { 
       Log.e("RssReader", e.getMessage()); 
       exceptionToBeThrown = e; 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(List<RssItem> result) { 
      if (exceptionToBeThrown != null) { 
       TextView error = (TextView) findViewById(R.id.errorMessage); 
       error.setText("No internet connection"); //Null pointer expection 
      } else { 

       // Get a ListView from main view 
       ListView listItems= (ListView) findViewById(R.id.listMainView); //Null pointer exception 

       // Create a list adapter 
       ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(local, android.R.layout.simple_list_item_1, result); 
       // Set list adapter for the ListView 
       listItems.setAdapter(adapter); 

       // Set list view item click listener 
       listItems.setOnItemClickListener(new ListListener(result, local)); 
      } 


    } 

}

Voici le code pour mon onglet Flux rss:

public class RssFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     new MainActivity(); 
     MainActivity ma = new MainActivity(); 
     GetRSSDataTask task = ma.new GetRSSDataTask(); 
     task.execute("newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml"); 

     View rootView = inflater.inflate(R.layout.fragment_rss_news, container, false); 
     return rootView; 
    } 
} 

On crée l'activité principale:

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

     // Set reference to this activity 
     local = this; 
     GetRSSDataTask task = new GetRSSDataTask(); 

     // Start download RSS task 
     task.execute("newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml"); 

     // Debug the thread name 
     Log.d("RssReader", Thread.currentThread().getName()); 

     // Initilization 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(mAdapter); 
     //actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 

     /** 
     * on swiping the viewpager make respective tab selected 
     * */ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 

    } 

Répondre

0

Explication: Essayez d'écrire votre classe GetRSSDataTask à l'intérieur de RssFragment et appelez-le à RssFragment au onCreateView. L'erreur est parce que vous créez l'instance de main activity pour appeler GetRSSDataTask dans RssFragment.

Solution: RssFragment.java:

public class RssFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     GetRSSDataTask task = new GetRSSDataTask(); 
     task.execute("newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml"); 

     View rootView = inflater.inflate(R.layout.fragment_rss_news, container, false); 
     return rootView; 
    } 


    public class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem>> { 

     private Activity ownerActivity; 
     private Exception exceptionToBeThrown; 

     @Override 
     protected List<RssItem> doInBackground(String... urls) { 

      // Debug the task thread name 
      Log.d("RssReader", Thread.currentThread().getName()); 

      try { 
       // Create RSS reader 
       RssReader rssReader = new RssReader(urls[0]); 

       // Parse RSS, get items 
       return rssReader.getItems(); 

      } catch (Exception e) { 
       Log.e("RssReader", e.getMessage()); 
       exceptionToBeThrown = e; 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(List<RssItem> result) { 
      if (exceptionToBeThrown != null) { 
       TextView error = (TextView) findViewById(R.id.errorMessage); 
       error.setText("No internet connection"); //Null pointer expection 
      } else { 

       // Get a ListView from main view 
       ListView listItems= (ListView) findViewById(R.id.listMainView); //Null pointer exception 

       // Create a list adapter 
       ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(local, android.R.layout.simple_list_item_1, result); 
       // Set list adapter for the ListView 
       listItems.setAdapter(adapter); 

       // Set list view item click listener 
       listItems.setOnItemClickListener(new ListListener(result, local)); 
      } 


    } 
} 

MainActivity.java onCreate:

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

     // Set reference to this activity 
     local = this; 

     // Debug the thread name 
     Log.d("RssReader", Thread.currentThread().getName()); 

     // Initilization 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(mAdapter); 
     //actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 

     /** 
     * on swiping the viewpager make respective tab selected 
     * */ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 

    } 
+0

C'est une bonne idée, mais la classe 'Fragment' fait partie de la bibliothèque Android – Thorviory

+0

@ TheSortOfProgrammer je veux dire votre Fragment, qui est RssFragment –

+0

J'ai essayé cela, mais cela signifierait que je devrais étendre la classe par activité et ce n'est pas possible, comme son Fragment déjà étendu – Thorviory