Android:类中的私有变量作用域

时间:2017-08-07 16:59:28

标签: java android

Requirement: I want passWord to be accessible everywhere in the class.

这是代码:

public class DetailComm extends AppCompatActivity {

    private String passWord;
    private Bundle bundle;
    private Button mSendButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bundle = getIntent().getExtras();
        mSendButton = (Button) findViewById(R.id.sendButton);

        final Query query = mFirebaseDatabaseReference.child(<mylink>).orderByKey().equalTo(<myname>);
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {

                for (final DataSnapshot snapshot: dataSnapshot.getChildren()) {
                    passWord = snapshot.getValue().toString();
                    //Point 1. Toast prints correct value of passWord here//
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError)
            {

            }
        });
        if (bundle != null) {
            for (String key : bundle.keySet()) {
                Toast.makeText(DetailComm.this, passWord.toString(), Toast.LENGTH_SHORT).show();
                //Point 2. Toast prints blank output here//
            }
        }

        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Point 3. Toast displays correct value of passWord here!!
            }
        }
    }
}

问题是:如何在第2点无法访问相同的变量?如果在第1点我设置passWord时,它在不同的类中,它可能会解释第2点有空字符串,但是,它是否也应该在点3处不可访问?我错过了什么?

如何在课堂上的任何地方访问passWord?我将其更改为公共变量,Point 2仍显示空值。此外,该类是项目中的众多类之一。我确定没有其他类具有此变量名称。

1 个答案:

答案 0 :(得分:0)

您在Listener匿名类中设置值,这意味着变量仅在事件发生时初始化,在您的情况下,FireBase数据库中的数据更改或第一次响应传递时。 但是第2点恰好在你设置了Listener后发生,所以它发生在第1点之前。这就是你给出null值的原因。 而且,此外,第3点也发生在lustener中,所以很不清楚哪个点将被称为第一点 - 第1点或第3点。