2010-06-23 5 views
3

Je partage certaines variables accross activités en utilisant une classe comme ceci:partage des variables "globales" entre activités, problème lors de l'utilisation d'un Webview ...?

public class Globals { 

static Boolean hint1_graph_type_switcher; 
static Boolean hint2_stockview_valuation; 

other variables ... 
    } 

alors j'utilise ces variables partout dans mes multiples activités avec ...

if (Globals.hint2_stockview_valuation == false) { 

     .... 

    } 

assez basique et il fonctionnait bien jusqu'à ...

J'introduit quelques trucs WebView comme ceci:

//----------------------------------------------------------- 
     // open a webview with the NEWS when the more_arrow is clicked : 
     mNews.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       String news_URL = "http://us.m.yahoo.com/w/yfinance/symbolheadlines/"+ ticker + "/?.intl=us&.lang=en"; 
       Intent news_Webview_intent = new Intent(Chart_View.this, News_Webview.class); 
       news_Webview_intent.putExtra("NEWS_URL", news_URL); 
       startActivity(news_Webview_intent); 
      } 
     }); 
     //----------------------------------------------------------- 

et voici le News_Webview.class:

public class News_Webview extends Activity { 

// 
// http://www.chrisdanielson.com/tag/progressdialog/ 
// 

String news_URL; 
private WebView webview; 
private ProgressDialog progressBar; 
private static final String TAG = "Hub"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.webview_news); 
    this.webview = (WebView)findViewById(R.id.webView); 


    Bundle extras = getIntent().getExtras(); 
    if (this.getIntent().getExtras()!=null){ 
     news_URL = extras.getString("NEWS_URL"); 
    } 


    WebSettings settings = webview.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

    final AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 

    progressBar = ProgressDialog.show(News_Webview.this, "", "Loading..."); 

    webview.setWebViewClient(new WebViewClient() { 

     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      //Log.i(TAG, "Processing webview url click..."); 
      Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse(url)); 
      startActivity(viewIntent); 
      return true; 
     }     

     public void onPageFinished(WebView view, String url) { 
      //Log.i(TAG, "Finished loading URL: " +url); 
      if (progressBar.isShowing()) { 
       progressBar.dismiss(); 
      } 
     } 

     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      Log.e(TAG, "Error: " + description); 
      Toast.makeText(News_Webview.this, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage(description); 
      alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        return; 
       } 
      }); 
      alertDialog.show(); 
     } 
    }); 
    webview.loadUrl(news_URL); 
    } 
} 

le problème est maintenant que, quand il « revient » de cette activité, il semble que mes variables Globals ont disparu ???

if (Globals.hint2_stockview_valuation == false) { 

incendies une erreur:

06-23 12: 14: 03,443: ERROR/AndroidRuntime (2611): causée par: java.lang.NullPointerException

2 questions alors:

  • Dois-je utiliser quelque chose e lse que cette classe "Global" pour partager des variables entre les activités? Est-ce juste une mauvaise pratique de le faire ?? Je sais que je peux utiliser les préférences mais je pensais qu'il était plus rapide de le faire de cette façon (pas besoin de "lire" les préférences chaque fois que je commence une nouvelle activité ...

  • Une idée sur pourquoi cela se passe? dois-je "retourner" mon savedInstanceState en quelque sorte quand mon activité revient de la News_Webview.class ???

Comme toujours, merci pour votre aide.

H.

Répondre

2

U pourrait utiliser intent.putExtra() pour inter-activité inte Une raction ...

Une chose (juste pour les diagnostics) que je suggérerais est d'initialiser les variables statiques à une certaine valeur, puis exécutez l'App ... je suppose que votre classe globale est réinitialisée lorsque l'intention a commencé l'activité retour ...

J'ai utilisé des variables globales, mais dans mon cas je les ai gardées dans une activité qui n'est jamais morte. Toutes les autres activités sont venues après elle et cela a fonctionné parfaitement bien ...

+0

Je le sais, merci. mais je partage aussi des objets plus complexes en utilisant cette technique (classe Global) ... et cela n'explique pas le problème énoncé ici. – Hubert

+0

En effet, il semble que l'activité soit redémarrée à son retour. SavedInstanceState enregistrerait-il ces variables quelque part? Devrais-je les récupérer d'une certaine manière peut-être?Comment avez-vous forcé votre "activité à ne jamais mourir"? – Hubert

+0

Eh bien, vous pouvez essayer de les enregistrer dans le SavedInstanceState dans le onPause(), les récupérer dans le onResume() de votre activité ... suppose que cela pourrait fonctionner ... – JaVadid

0

Le NullPointerException bouillonne à partir de l'exécution android et n'a rien à voir avec votre type Globals.

+0

pouvez-vous expliquer un peu ... je ne comprends pas ce que vous voulez dire? – Hubert

+0

Examinez votre callstack de plus près, je pense qu'il se passe quelque chose en chargeant le ' Vous pouvez le confirmer en commentant temporairement le code qui vous accède. type. – ktingle

+0

Je suppose que la plupart des NullPointerException sont lancées avec la balise AndroidRuntime ... :) – JaVadid