gpt4 book ai didi

java - Java 初始化的奇怪行为

转载 作者:搜寻专家 更新时间:2023-11-01 08:05:58 24 4
gpt4 key购买 nike

/**
* Example Activity to demonstrate the lifecycle callback methods.
*/
public class ActivityA extends Activity {

private String mActivityName;
private TextView mStatusView;
private TextView mStatusAllView;
private StatusTracker mStatusTracker = StatusTracker.getInstance();
private AlertDialog alertBox;
private static int number = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);

init();

String output = getString(R.string.on_create) + number++;
showAlertDialog(alertBox, output);
mStatusTracker.setStatus(mActivityName, output);
Utils.printStatus(mStatusView, mStatusAllView);
}

@Override
protected void onStart() {
super.onStart();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_start));
Utils.printStatus(mStatusView, mStatusAllView);
}

@Override
protected void onRestart() {
super.onRestart();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_restart));
Utils.printStatus(mStatusView, mStatusAllView);
}

@Override
protected void onResume() {
super.onResume();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_resume));
Utils.printStatus(mStatusView, mStatusAllView);
}

@Override
protected void onPause() {
super.onPause();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_pause));
Utils.printStatus(mStatusView, mStatusAllView);
}

@Override
protected void onStop() {
super.onStop();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_stop));
}

@Override
protected void onDestroy() {
super.onDestroy();
mStatusTracker.setStatus(mActivityName, getString(R.string.on_destroy));
mStatusTracker.clear();
}

public void startDialog(View v) {
Intent intent = new Intent(ActivityA.this, DialogActivity.class);
startActivity(intent);
}

public void startActivityB(View v) {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
}

public void startActivityC(View v) {
Intent intent = new Intent(ActivityA.this, ActivityC.class);
startActivity(intent);
}

public void finishActivityA(View v) {
ActivityA.this.finish();
}

private void showAlertDialog(AlertDialog ad, String msg) {
ad.setTitle("Logging Msg");
ad.setMessage(msg);
ad.show();
}

private void init() {
System.out.println("Value = before &&&&&&&&& " + alertBox);
if (alertBox == null) { // Why always null?
alertBox = new AlertDialog.Builder(this).create();
mActivityName = getString(R.string.activity_a);
mStatusView = (TextView) findViewById(R.id.status_view_a);
mStatusAllView = (TextView) findViewById(R.id.status_view_all_a);
Log.e("ActivityA", "Init done **************************************");
Log.e("ActivityA", "Init done **************************************");
System.out.println("Value = after &&&&&&&&&&& " + alertBox);
}
}
}

仅在第一次调用 init 时,我设置了 alertBox 并且我认为 if block 不应在任何其他时间执行。但我错了,每次调用 init 时它都会运行。为什么?

我是Javascript出身,如果我把上面的代码翻译成JS(类似),if block 只会求值一次。

最佳答案

alertBox 是类的成员变量,即类的每个实例都有自己的副本。因此,如果您有多个 ActivityA 实例,每个实例都有自己的 alertBox 最初都设置为 null

如果你想分享alertBox你需要声明它为static:

private static AlertDialog alertBox;

尽管如此,这可能会导致多线程应用程序出现(额外的)问题,因此请谨慎使用!

关于java - Java 初始化的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com