Android “分享”;“全球”;跨活动的变量,使用Webview时出现问题。。。?

Android “分享”;“全球”;跨活动的变量,使用Webview时出现问题。。。?,android,global-variables,webview,Android,Global Variables,Webview,我正在使用这样的类共享一些跨活动的变量: public class Globals { static Boolean hint1_graph_type_switcher; static Boolean hint2_stockview_valuation; other variables ... } 然后我在我的多个活动中的任何地方使用这些变量 if (Globals.hint2_stockview_valuation == false) { ....

我正在使用这样的类共享一些跨活动的变量:

public class Globals {

static Boolean hint1_graph_type_switcher; 
static Boolean hint2_stockview_valuation;

other variables ...
    }
然后我在我的多个活动中的任何地方使用这些变量

if (Globals.hint2_stockview_valuation == false) {

        ....

    }
非常基本,它一直工作良好,直到

我介绍了一些webview内容,如下所示:

//-----------------------------------------------------------
        // 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);
            }
        });
        //-----------------------------------------------------------
下面是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);
    }
}
现在的问题是,当它从这个活动中“回来”时,我的全局变量似乎消失了

if (Globals.hint2_stockview_valuation == false) {
引发一个错误:

06-23 12:14:03.443: 错误/AndroidRuntime(2611):由以下原因引起: java.lang.NullPointerException

2个问题:

  • 我是否应该使用这个“全局”类以外的其他类来跨活动共享变量?这样做只是不好的习惯吗??我知道我可以使用首选项,但我认为这样做更快(无需每次开始新活动时都“阅读”首选项

  • 知道为什么会发生这种情况吗?当我的活动从News_Webview.class返回时,我是否应该以某种方式“返回”我的savedInstanceState

一如既往,谢谢你的帮助


H.

U可以使用
intent.putExtra()
进行活动间交互

我建议的一件事(仅用于诊断)是将静态变量初始化为某个值,然后运行应用程序…我想当intent started活动返回时,您的全局类正在重新初始化


我使用过全局变量,但在我的例子中,我将它们保存在一个从未停止过的活动中。所有其他活动都是在它之后进行的,并且工作得非常好…

NullPointerException是从android运行时冒出来的,与您的全局变量类型无关。

我知道这一点,谢谢。但我还使用这项技术(全局类)…并没有解释此处所述的问题。事实上,当活动返回时,它看起来像是重新启动的。savedInstanceState会将这些变量保存在某个地方吗?我是否应该以某种方式将它们取回来?您是如何强制“活动永不消亡”的?您可以尝试将它们保存在SavedInstanceState的onPause()中,在活动的onResume()中检索它们…我想这可能会解决…好的,我可以对基本类型这样做,但我可以对更复杂的对象也这样做吗?然后我需要将它们保存为可序列化的文件吗(这会使整个过程变慢,不是吗)?我想你会问……是的,这就是复杂对象的问题……正如这篇文章所解释的,我可以建议你在调用intent的活动中创建相同的对象,并在onPause()中用你的数据填充它们…然后将这些值分配给onResume()中的实际全局变量…等等???你能解释一下吗…我不明白你的意思?更仔细地检查你的调用堆栈;我猜在加载“back”活动时发生了一些事情。你可以通过临时注释访问你全局类型的代码来确认这一点。我猜大多数NullPointerException都是与AndroidRuntime ta一起抛出的g、 ..:)无论系统的状态如何,访问静态布尔变量都不会导致NullPointerException。