Autore Topic: [Risolto]Strano errore nella pagina dei feed rss se accessa da offline  (Letto 767 volte)

Offline Mic87xp1

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Salve ragazzi ho un problema. Nella mia applicazione ho inserito una pagina che carica i feed rss sul mio sito grazie al vostro aiuto, però adesso ho notato una bug.
Quando accedo nella pagina mentre sono disconnesso mi appare giustamente la dialog che avvisa l'utente che non è collegato ad internet.
Quando però premo sul pulsante indietro per tornare alla pagina precedente mi si genera un errore che però non viene sollevato da una della classi programmate da me ma da Android stesso che mi fa crashare l'app.
Ho paura di non aver programmato bene l'AsyncTask però voglio chiedervi se potreste darmi una mano a capire l'errore.
Il logcat dice:
Codice: [Seleziona]
12-27 01:39:53.640: E/AndroidRuntime(26376): FATAL EXCEPTION: main
12-27 01:39:53.640: E/AndroidRuntime(26376): java.lang.IllegalStateException: Observer android.widget.AbsListView$AdapterDataSetObserver@419d5218 was not registered.
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.database.Observable.unregisterObserver(Observable.java:64)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.widget.AbsListView.onDetachedFromWindow(AbsListView.java:2849)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.View.dispatchDetachedFromWindow(View.java:9937)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2282)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2280)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2280)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2280)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2280)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2280)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:2438)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewRootImpl.doDie(ViewRootImpl.java:3985)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.ViewRootImpl.die(ViewRootImpl.java:3973)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:342)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.view.WindowManagerImpl$CompatModeWrapper.removeViewImmediate(WindowManagerImpl.java:161)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3165)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.app.ActivityThread.access$1200(ActivityThread.java:128)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1194)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.os.Handler.dispatchMessage(Handler.java:99)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.os.Looper.loop(Looper.java:137)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at android.app.ActivityThread.main(ActivityThread.java:4517)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at java.lang.reflect.Method.invokeNative(Native Method)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at java.lang.reflect.Method.invoke(Method.java:511)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
12-27 01:39:53.640: E/AndroidRuntime(26376):         at dalvik.system.NativeStart.main(Native Method)


E si genera quando clicco sul pulsante indietro che ho messo nella pagina oppure sul pulsante indietro di Android.
La classe che gestisce l'Activity dei FeedRss è questa:
Codice (Java): [Seleziona]
public class Feedrss extends Activity {
       
        private Button indietroB;
        public ArrayAdapter adapter;
        public ProgressDialog pd;
        public ListView itcItems;

        @SuppressLint("ParserError")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.feedrss);
                indietroB = (Button)findViewById(R.id.backBFeed);
                indietroB.setOnClickListener(new BackListener());
                itcItems = (ListView) findViewById(R.id.listMainView);
            List<String> lista = new LinkedList();
            lista.add("Caricamento in corso...");
            adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,lista);
            itcItems.setAdapter(adapter);
            pd = new ProgressDialog(this);
            pd.setMessage("Caricamento in corso");
            pd.show();
                //new RssThread("[url=http://mic87xp1.altervista.org/wordpress/?feed=rss2",this]Programmazione & Informatica[/url]).start();
            new RssTask(this).execute();
               
               
               
    }
        private class BackListener implements OnClickListener{

                public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        try{
                                onBackPressed();
                        }
                        catch(IllegalStateException e){
                                e.printStackTrace();
                        }
                }
               
        }
        public void noInternetDialog(){
               
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Internet non disponibile");
                builder.setMessage("Impossibile trovare il canale Feed Rss.\nControllare la connessione ad internet e eventualmente contattare lo sviluppatore");
                builder.setIcon(android.R.drawable.ic_dialog_alert);
                builder.setCancelable(false);
                builder.setPositiveButton("Ok", new OkPositiveButton());
                AlertDialog alert = builder.create();
                alert.show();

        }
        class OkPositiveButton implements DialogInterface.OnClickListener{
                public void onClick(DialogInterface dialog, int which){
                        dialog.dismiss();
                }
        }
       
       
       
}

Mentre l'RssTask l'ho programmato così (sempre grazie a voi):

Codice (Java): [Seleziona]
public class RssTask extends AsyncTask<Void, Void, List<RssItem>> {
       
        Feedrss mainActivity;
       
        public RssTask(Feedrss main){
                mainActivity = main;
        }

        @Override
        protected List<RssItem> doInBackground(Void... arg0) {
                // TODO Auto-generated method stub
                RssReader rssReader = new RssReader("[url=http://mic87xp1.altervista.org/wordpress/?feed=rss2"]Programmazione & Informatica[/url]);
                List<RssItem> result = null;
                try{
                        result = rssReader.getItems();
                }
                catch(Exception e){
                        Log.e("RssTask", "Errore nell'AsyncTask", e);
                }
                return result;
        }

        @Override
        protected void onPostExecute(List<RssItem> result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                try{
                        ArrayAdapter adapter = new ArrayAdapter(mainActivity,android.R.layout.simple_list_item_1, result);
                        mainActivity.adapter = adapter;
                        mainActivity.itcItems.setAdapter(adapter);
                        mainActivity.itcItems.setOnItemClickListener(new ListListener(result, mainActivity));
                        mainActivity.pd.dismiss();
                }
                catch (NullPointerException e){
                        mainActivity.pd.dismiss();
                        mainActivity.noInternetDialog();
                }
                catch (IllegalArgumentException e){
                        mainActivity.pd.dismiss();
                        mainActivity.noInternetDialog();
                }
        }
       
       

}
« Ultima modifica: 16 Gennaio 2013, 13:34:51 CET da Mic87xp1 »

Offline Mic87xp1

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Strano errore nella pagina dei feed rss se accessa da offline
« Risposta #1 il: 31 Dicembre 2012, 20:00:51 CET »
0
Nessuno sa come aiutarmi? ^^"

Offline Mic87xp1

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Strano errore nella pagina dei feed rss se accessa da offline
« Risposta #2 il: 16 Gennaio 2013, 13:34:12 CET »
0
Ho risolto così. Prima di accedere all'activity controllo se internet è connesso. Se non è connesso non faccio proprio aprire l'activity visualizzando una dialog.
Pubblico il codice che fa ciò, magari può essere utile per qualcuno di voi :)
Nel Manifest ho aggiunto questo permesso:
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Nella classe dell'activity che lancia la seconda activity ho messo questo:
Codice (Java): [Seleziona]
//Questo controlla se c'è una connessione.
protected boolean isNetworkConnected(){
                ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo ni = cm.getActiveNetworkInfo();
                if(ni!=null){
                        Log.d(TAG,"Rete trovata:"+ni.getTypeName());
                        if(ni.isConnected()){
                                return true;
                        }
                }
            return false;  
        }
/*Log.d(TAG,"Rete trovata:"+ni.getTypeName()); potete commentarlo :) L'ho usato solo per vedere se entrambe le connessioni
*venivano riconosciute (wifi e 3g).
*Questo lancia l'activity se la connessione (Wifi o 3G) è instaurata
*/


        private class FeedRssListener implements OnClickListener{

                public void onClick(View arg0) {
                        boolean connesso = isNetworkConnected();
                        if(connesso){
                                Intent feedRss=new Intent("org.altervista.mic87xp1.michele.FEEDRSS");
                                startActivity(feedRss);
                        }
                        else{
                                noInternetDialog();
                        }
                }
               
        }