【问题标题】:sharing "Global" variables across activities, problem when using a Webview...?跨活动共享“全局”变量,使用 Webview 时出现问题...?
【发布时间】:2011-03-07 06:08:30
【问题描述】:

我通过使用这样的类来共享活动中的一些变量:

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);
    }
}

现在的问题是,当它从这个 Activity “回来”时,看起来我的 Globals 变量已经消失了???

if (Globals.hint2_stockview_valuation == false) {

引发错误:

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

然后2个问题:

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

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

一如既往,感谢您的帮助。

H.

【问题讨论】:

    标签: android global-variables webview


    【解决方案1】:

    你可以使用intent.putExtra()进行交互交互...

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

    我使用了全局变量,但就我而言,我将它们保存在一个永不消亡的活动中。所有其他活动都在它之后进行,并且运行良好......

    【讨论】:

    • 我知道,谢谢。但我也在使用这种技术(全局类)共享更复杂的对象......它并没有解释这里所说的问题。
    • 确实,当它回来时,它看起来像是重新启动了 Activity。 savedInstanceState 会将这些变量保存在某处吗?我应该以某种方式让他们回来吗?你是如何强迫你的“活动永不消亡”的?
    • 你可以尝试将它们保存在 onPause() 中的 savedInstanceState 中,然后在你的活动的 onResume() 中检索它们...猜猜这可能会成功...
    • 好的,我可以对原始类型执行此操作,这将非常好,但我也可以对更复杂的对象执行此操作吗?然后我是否需要将它们作为可序列化的文件保存在文件中(会减慢整个过程,不是吗)?
    • 我想你会问那个...是的,这就是复杂对象的问题..stackoverflow.com/questions/1984682.. 就这篇文章的解释而言,我可以建议你可以制作Activity 中调用意图的相同对象并在 onPause() 中用您的数据填充它们...然后将这些值分配给 onResume() 中的实际全局变量...看看???
    【解决方案2】:

    NullPointerException 是从 android 运行时冒出来的,与您的 Globals 类型无关。

    【讨论】:

    • 你能解释一下吗...我不明白你的意思?
    • 更仔细地检查你的调用栈;我的猜测是加载“返回”活动时发生了一些事情。您可以通过暂时注释掉访问您的全局类型的代码来确认这一点。
    • 我猜大部分 NullPointerException 都是用 AndroidRuntime 标签抛出的...... :)
    • 无论系统处于何种状态,访问静态布尔变量都不会导致 NullPointerException。
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2017-08-19
    • 2012-01-20
    • 2014-05-17
    相关资源
    最近更新 更多